对于给定的列表,我希望:
- 只对第一个元素,然后每第 3 个后续元素(索引 3、6 等)不做任何事情
- 从第二个元素(索引1)开始,然后对每3个元素(索引4、7等)执行一定的操作
- 从第三个元素(索引 2)开始,然后对每 3 个元素(索引 5、8 等)执行不同的操作
我可以结合使用 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 之类的索引
Python 是否提供用于自定义逐步切片的内置机制? 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
调用的作为参数,对于 data
枚举中的每个索引 i
和元素 x
。
显然,如果您需要 data
而不是返回一个新列表,您可以在常规的 for
循环中执行此操作:
for i, x in enumerate(data):
data[i] = (nop, op1, op2)[i % 3](x)
关于python - 根据列表项的索引模进行不同的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40757843/