从列表或元组中显式选择项目

165 投票
9 回答
474548 浏览
提问于 2025-04-16 21:08

我有一个这样的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 的用法不一样,因为它们是切片。

撰写回答