123

考虑下面的 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]
4

4 回答 4

224
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
于 2013-02-13T23:01:37.407 回答
44

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

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
于 2013-02-13T23:02:19.390 回答
12

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

于 2013-02-14T00:01:54.157 回答
3

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

这可以如下所示完成:

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

于 2021-06-15T18:06:58.387 回答