在 Python 列表内涵中是否可以访问条目索引?

考虑下面的 Python 代码,我用它在一个新的 list2中添加了 list1中索引从1到3的所有条目:

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]
100872 次浏览
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]

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

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

除非您的实际用例更加复杂,否则您应该像@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']

对于更复杂的情况-如果您实际上不需要索引-在一个切片或一个切片上迭代会更清楚

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]。如果片可以变得很大,那么最好使用一个片来避免复制内存

对于那些想知道的人来说,如果你的用例需要的话,你可以很容易地存储匹配的索引作为列表内涵的结果。您可能需要评估列表中每个项的值,以确定它是否匹配某个值或模式,并且您只想获得一个匹配索引的列表,以便以后处理,而不是匹配值。

这可以如下所示:

>>> 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,而不是使用更典型的 [x for x in l if ...]或替代的 [x for i, x in enumerate(l) if ...]枚举列表内涵模式所获得的值 x