是Python列表理解,可以访问索引/枚举吗?

时间:2013-02-13 22:59:57

标签: python list indexing list-comprehension

考虑下面的Python代码,我在新的list2中添加了list1的1到3的所有项目:

for ind, obj in enumerate(list1):
    if 4> ind > 0: list2.append(obj)

如果我无法通过枚举访问索引,你会如何使用python list comprehension编写这个?

类似的东西:

list2 = [x for x in list1 if 4>ind>0]

但由于我没有'ind'号码,这会有效吗? :

list2 = [x for x in enumerate(list1) if 4>ind>0]

4 个答案:

答案 0 :(得分:144)

list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]

答案 1 :(得分:31)

如果您使用enumerate,则执行可以访问索引:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]

答案 2 :(得分:6)

除非您的实际用例更复杂,否则您应该使用@wim

建议的列表切片
>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

对于更复杂的情况 - 如果你实际上不需要索引 - 迭代切片或islice更清楚

list2 = [x*2 for x in list1[1:4]]

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

对于小切片,简单list1[1:4]。如果切片可能变得非常大,最好使用islice来避免复制内存

答案 3 :(得分:0)

对于那些想知道的人,如果您的用例需要,您可以像存储列表理解一样轻松地存储匹配索引。可能您需要评估列表中每个项目的值以确定它是否与某个值或模式匹配,并且您只想获取匹配索引的列表以供后续处理而不是匹配值。

这可以按如下所示完成:

>>> values = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> search = ['one', 'three', 'five']
>>> matches = [i for i, x in enumerate(values) if x in search]
>>> print(matches)
[1, 3, 5]

上面的重要部分是在列表推导式中使用 [i for i, x in enumerate(l) if ...] 模式,其中索引 i 被捕获而不是使用 more典型的 x 或替代的 [x for x in l if ...] 枚举列表理解模式。