根据列表项的索引模数执行不同的操作
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版)系列,为了便于解释,我只是使用了一个常规列表的例子。
【问题讨论】:
你为什么有::2
? 2::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? 这并不是一个真正的特殊符号,只是索引和调用语法的一种稍微不寻常的组合。以上是关于根据列表项的索引模数执行不同的操作的主要内容,如果未能解决你的问题,请参考以下文章
包装在 HorizontalScrollView 中的 Android Listview 高度不正确,其中列表项的高度不同