我有一个列表包含或多或少的随机值。列表始终具有固定长度。 我有另一个包含整数值的列表。这些值始终小于第一个列表的长度。
我想计算一个列表,其中包含第一个列表中的所有值,其索引由第二个列表中的值描述。 我想出了以下内容:
>>> values = ['000', '111', '222', '333', '444', '555', '666', '777']
>>> indices = [2, 4, 7]
>>> [v for i, v in enumerate(values) if i in indices]
['222', '444', '777']
由于我的名单相当小(24个元素),这对我来说没问题。无论如何,我想知道是否有更优雅的解决方案,不计算临时列表(enumerate()
)。
答案 0 :(得分:3)
>>> values = ['000', '111', '222', '333', '444', '555', '666', '777']
>>> indices = [2, 4, 7]
您可以使用简单的列表理解
>>> [values[index] for index in indices]
['222', '444', '777']
您可以使用operator.itemgetter
,就像这样
>>> from operator import itemgetter
>>> itemgetter(*indices)(values)
('222', '444', '777')
>>> list(itemgetter(*indices)(values))
['222', '444', '777']
或者您可以使用__getitem__
调用魔术方法map
,就像这样
>>> map(values.__getitem__, indices)
['222', '444', '777']
如果您使用的是Python 3.x,那么您可能希望将list
与map
>>> list(map(values.__getitem__, indices))
['222', '444', '777']
如果您不想创建整个列表,那么您可以创建一个生成器表达式并使用next
来获取值。
>>> filtered = (values[index] for index in indices)
>>> next(filtered)
'222'
>>> next(filtered)
'444'
>>> next(filtered)
'777'
>>> next(filtered)
Traceback (most recent call last):
File "<input>", line 1, in <module>
StopIteration
如果您只是迭代结果,那么我建议使用生成器表达式方法。
>>> for item in (values[index] for index in indices):
... print(item + ' ' + item)
...
222 222
444 444
777 777