根据列表项的索引模数执行不同的操作

时间:2016-11-23 06:52:04

标签: python python-2.7 list pandas slice

对于给定的列表,我希望:

  1. 仅针对第一个元素,然后每隔3个后续元素(索引3,6等),不执行任何操作
  2. 从第二个元素(索引1)开始,然后每3个元素(索引4,7等)开始,执行某个操作
  3. 从第三个元素(索引2)开始,然后每3个元素(索引5,8等)开始,执行不同的操作
  4. 我可以使用合并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,我实际上正在处理一个大熊猫(版本0.18.0)系列,我刚刚使用了常规列表的例子以便于解释。

1 个答案:

答案 0 :(得分:5)

您不需要对数据进行多次传递,也不需要进行任何切片:

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)]

产生以下result

['One', 'TWO', 'eerhT', 'Four', 'FIVE', 'xiS', 'Seven', 'EIGHT', 'eniN']

如果不清楚,这里发生的是(nop, op1, op2)的第{i%3}个元素被x作为参数调用,对于每个索引i枚举x中的元素data

显然,如果你需要做 data而不是返回一个新列表,你可以在常规for循环中这样做:

for i, x in enumerate(data):
    data[i] = (nop, op1, op2)[i % 3](x)