在Python列表理解中可以访问项目索引吗?


90

考虑下面的Python代码,我用它在list2索引中从1到3的所有新项中添加list1

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

如果我无法通过枚举访问索引,您将如何使用列表理解来编写此代码?

就像是:

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

但是由于我没有ind电话,这行得通吗?

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

3
我想您的实际用list1[1:4]
例会

您的意思是说我可以将列表切入列表理解内?喜欢:[x for x in list1[1:4]]
帕夫·阿梅特维奇

@PavAmetvic,没有@wim意味着您可以写list2 = list1[1:4]
John La Rooy

Answers:



37

如果使用enumerate可以访问该索引:

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

10

除非您的实际用例更加复杂,否则应该只使用@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以避免复制内存


谢谢,但是由于我想在理解内的'x'上执行操作(让我说x * x),然后再将其存储在新列表内,因此看起来像在列表理解内使用切片是最好的方法!谢谢
Pav Ametvic

@PavAmetvic,好吧,这些案例仍然很简单,不需要枚举
John La Rooy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.