在 Python 列表理解中是不是可以访问项目索引?
Posted
技术标签:
【中文标题】在 Python 列表理解中是不是可以访问项目索引?【英文标题】:In Python list comprehension is it possible to access the item index?在 Python 列表理解中是否可以访问项目索引? 【发布时间】:2013-01-29 16:05:10 【问题描述】:考虑下面的 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]
【问题讨论】:
我猜你的实际用例更复杂,但你可以简单地在这里切片list1[1:4]
你的意思是我可以在列表理解中对列表进行切片?喜欢:[x for x in list1[1:4]]
?
@PavAmetvic,没有@wim 意味着你可以写list2 = list1[1:4]
【参考方案1】:
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0]
【讨论】:
【参考方案2】:如果您使用enumerate
,您确实可以访问索引:
list2 = [x for ind, x in enumerate(list1) if 4>ind>0]
【讨论】:
【参考方案3】:除非您的实际用例更复杂,否则您应该只使用@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)执行操作,因此看起来就像在列表理解中使用切片是最好的办法!谢谢 @PavAmetvic,好的,这些情况仍然很简单,不需要枚举【参考方案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 ...]
枚举列表理解模式。
【讨论】:
以上是关于在 Python 列表理解中是不是可以访问项目索引?的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中,如何找到不是某个值的列表中第一项的索引?