python - 根据列表项的索引模进行不同的操作

标签 python python-2.7 list pandas slice

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

  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.

但是这里有几个问题:

  • 我不需要访问元素 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/

相关文章:

python - 在附加到列表之前剥离行编辑?

list - 使用 lisp 中的嵌套列表删除列表的重复元素

python - 获取 JSON 数组的大小并读取它的元素 Python

python - MongoDB中基于日期字段的计数和聚合

python - 在 pandas 数据框列名称中插入列表

Javascript 不会加载包含 jQuery mobile 的链接

python-2.7 - Pygame - pygame.mouse.get_pos 问题

python - 从 pandas 数据框中的多行中提取非 nan 值

Python + BeautifulSoup : How to get wrapper out of HTML based on text?

javascript - 从对象列表中获取所有可能的对象键 Javascript/TypeScript