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

Pav*_*vic 79 python indexing list-comprehension list

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

for ind, obj in enumerate(list1):
    if 4> ind > 0: list2.append(obj)
Run Code Online (Sandbox Code Playgroud)

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

就像是:

list2 = [x for x in list1 if 4>ind>0]
Run Code Online (Sandbox Code Playgroud)

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

list2 = [x for x in enumerate(list1) if 4>ind>0]
Run Code Online (Sandbox Code Playgroud)

Pav*_*sov 156

list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
Run Code Online (Sandbox Code Playgroud)


Bre*_*arn 32

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

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
Run Code Online (Sandbox Code Playgroud)


blu*_*ary 8

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

这可以如下所示完成:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*ooy 7

除非您的实际用例更复杂,否则您应该使用@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']
Run Code Online (Sandbox Code Playgroud)

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

list2 = [x*2 for x in list1[1:4]]
Run Code Online (Sandbox Code Playgroud)

要么

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]
Run Code Online (Sandbox Code Playgroud)

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