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

新手上路,请多包涵

我有以下 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]

原文由 Kit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 776
2 个回答
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 中,第 1 个更改为与第 4 个相同。


另一种选择是从 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 与切片的工作方式不同。

原文由 Dan D. 发布,翻译遵循 CC BY-SA 3.0 许可协议

那这个呢:

 from operator import itemgetter
itemgetter(0,2,3)(myList)
('foo', 'baz', 'quux')

原文由 Marcin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题