Python 根据列表项的索引模数执行不同的操作
对于给定的列表,我希望:Python 根据列表项的索引模数执行不同的操作,python,python-2.7,list,pandas,slice,Python,Python 2.7,List,Pandas,Slice,对于给定的列表,我希望: 仅对第一个元素,然后每第三个后续元素(索引3、6等)不执行任何操作 从第二个元素(索引1)开始,然后每3个元素(索引4、7等)执行一次特定操作 从第三个元素(索引2)开始,然后每3个元素(索引5、8等)执行一次不同的操作 我可以使用combinerange(len(mylist))和:符号按步骤对列表进行切片: 1::3 will give me the elements at indices 1, 4, 7, 10 etc. ::2 will give me the
range(len(mylist))
和:
符号按步骤对列表进行切片:
1::3 will give me the elements at indices 1, 4, 7, 10 etc.
::2 will give me the elements at indices 0, 2, 4, 6 etc.
但这里有几个问题:
- 例如,我不需要访问元素6
- 有一些重叠 在两片之间
- 缺少诸如5之类的索引
FWIW,我实际上是在处理pandas(版本0.18.0)系列,为了便于解释,我刚刚使用了常规列表的示例。您不需要对数据进行多次传递,也不需要进行任何切片:
def nop(x): return x
def op1(x): return x.upper()
def op2(x): return x[::-1]
data = 'One Two Three Four Five Six Seven Eight Nine'.split()
result = [(nop, op1, op2)[i % 3](x) for i, x in enumerate(data)]
这将产生以下结果
:
['One', 'TWO', 'eerhT', 'Four', 'FIVE', 'xiS', 'Seven', 'EIGHT', 'eniN']
如果不清楚,(nop,op1,op2)
的第(i%3)个元素用x
作为参数调用,用于数据
枚举中的每个索引i
和元素x
显然,如果您需要对数据
执行操作而不是返回新列表,则可以在常规的for
循环中执行此操作:
for i, x in enumerate(data):
data[i] = (nop, op1, op2)[i % 3](x)
你为什么有
::2
<代码>2::3听起来更像是你想要实现的目标。请注意,切片表示法是start:end:step
,您可以使用示例列表的示例更好地向其他人解释,并希望基于该列表进行输出。根据我的理解,你已经知道列表切片是如何工作的了。我不理解你提到的问题部分。@Lolgast yep2::3
是缺少的部分,thanks@MoinuddinQuadri的确谢谢你告诉我,我所要做的就是重读我想要达到的目标,看看我已经得到了答案。我熟悉列表理解和enumerate()
,但以前从未见过这种符号(nop,op1,op2)[I%3](x)
。这叫什么?@Pyderman这种技术被称为“调用者分派”,或者更常见的是“dict分派”(因为在许多有用的情况下,dict倾向于使用,而不是元组)。这里有一篇关于它的帖子:它不是一个真正的特殊符号,只是索引和调用语法的一个稍微不寻常的组合。