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

Pyd*_*man 4 python list slice python-2.7 pandas

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

  1. 对于第一个元素,然后每个第3个后续元素(索引3,6等),什么也不做
  2. 从第二个元素(索引1)开始,然后每3个元素(索引4,7等)开始,执行某个操作
  3. 从第三个元素(索引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.
Run Code Online (Sandbox Code Playgroud)

但这里有一些问题:

  • 例如,我不需要访问元素6
  • 两个切片之间存在一些重叠
  • 缺少5个指数

Python是否为自定义逐步切片提供了内置机制?FWIW,我实际上正在处理一个大熊猫(版本0.18.0)系列,我刚刚使用了常规列表的例子以便于解释.

Zer*_*eus 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)]
Run Code Online (Sandbox Code Playgroud)

产生以下内容result:

['One', 'TWO', 'eerhT', 'Four', 'FIVE', 'xiS', 'Seven', 'EIGHT', 'eniN']
Run Code Online (Sandbox Code Playgroud)

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

显然,如果你需要做的事情 data,而不是返回一个新的列表,你可以在一个普通这么做for循环:

for i, x in enumerate(data):
    data[i] = (nop, op1, op2)[i % 3](x)
Run Code Online (Sandbox Code Playgroud)

  • 我从这个anwer +1中学到了一些新东西 (3认同)