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

Posted

技术标签:

【中文标题】根据列表项的索引模数执行不同的操作【英文标题】:Perform different operations based on index modulus of list items 【发布时间】:2017-04-07 01:43:27 【问题描述】:

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

    仅对第一个元素,然后是每第三个后续元素(索引 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版)系列,为了便于解释,我只是使用了一个常规列表的例子。

【问题讨论】:

你为什么有::22::3 听起来更像是您想要实现的目标。请注意,切片符号是start:end:step 您会使用示例列表示例更好地向其他人解释,并希望基于该列表的输出。并根据例子给出解释 据我了解,您已经知道列表切片的工作原理。我不明白你提到的问题部分。 @Lolgast 是的 2::3 是缺失的部分,谢谢 @MoinuddinQuadri 确实如此。感谢您向我展示我所要做的就是重新阅读我想要实现的目标,看看我已经有了答案。 【参考方案1】:

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

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)

【讨论】:

我熟悉列表理解和enumerate(),但之前没有见过(nop, op1, op2)[i % 3](x) 这种表示法。这叫什么? @Pyderman 该技术被称为“调用者调度”,或者更常见的是“字典调度”(因为在许多有用的情况下倾向于使用字典而不是元组)。这是一篇关于它的帖子:Why store a function inside a python dictionary? 这并不是一个真正的特殊符号,只是索引和调用语法的一种稍微不寻常的组合。

以上是关于根据列表项的索引模数执行不同的操作的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何让列表视图中的图像与列表项的操作不同?

包装在 Horizo​​ntalScrollView 中的 Android Listview 高度不正确,其中列表项的高度不同

如何根据原始列表相同的值但不同的索引创建新列表

菜单项单击事件根据索引

Redis数据操作--列表

离子框架:每个列表项的不同背景颜色