从列表或元组中显式选择项目
我有一个这样的Python列表(也可以是元组):
myList = ['foo', 'bar', 'baz', 'quux']
我可以这样说:
>>> myList[0:3]
['foo', 'bar', 'baz']
>>> myList[::2]
['foo', 'baz']
>>> myList[1::2]
['bar', 'quux']
我该怎么做才能明确地选择那些没有特定规律的索引的项目呢?比如,我想选择 [0,2,3]
。或者在一个有1000个项目的大列表中,我想选择 [87, 342, 217, 998, 500]
。有没有什么Python的语法可以做到这一点?看起来像这样:
>>> myBigList[87, 342, 217, 998, 500]
9 个回答
18
也许可以用列表推导式来解决这个问题:
L = ['a', 'b', 'c', 'd', 'e', 'f']
print [ L[index] for index in [1,3,5] ]
这样会产生:
['b', 'd', 'f']
这就是你想要的结果吗?
60
这个怎么样:
from operator import itemgetter
itemgetter(0,2,3)(myList)
('foo', 'baz', 'quux')
208
list( myBigList[i] for i in [87, 342, 217, 998, 500] )
我用 Python 2.5.2 比较了一些方法的执行时间:
19.7 微秒:
[ myBigList[i] for i in [87, 342, 217, 998, 500] ]
这个方法最快。20.6 微秒:
map(myBigList.__getitem__, (87, 342, 217, 998, 500))
这个方法稍慢一点。22.7 微秒:
itemgetter(87, 342, 217, 998, 500)(myBigList)
这个方法又慢了一些。24.6 微秒:
list( myBigList[i] for i in [87, 342, 217, 998, 500] )
这个方法是最慢的。
需要注意的是,在 Python 3 中,第一个方法的表现和第四个方法是一样的。
另外一个选择是使用 numpy.array
,它可以通过列表或另一个 numpy.array
来进行索引:
>>> import numpy
>>> myBigList = numpy.array(range(1000))
>>> myBigList[(87, 342, 217, 998, 500)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: invalid index
>>> myBigList[[87, 342, 217, 998, 500]]
array([ 87, 342, 217, 998, 500])
>>> myBigList[numpy.array([87, 342, 217, 998, 500])]
array([ 87, 342, 217, 998, 500])
而 tuple
的用法不一样,因为它们是切片。