1. ホーム
  2. python

[解決済み] リストやタプルから明示的に項目を選択する

2022-05-16 04:34:29

質問

以下のような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]

どのように解決するのですか?

list( myBigList[i] for i in [87, 342, 217, 998, 500] )


python2.5.2で比較しました。

  • 19.7 usecです。 [ myBigList[i] for i in [87, 342, 217, 998, 500] ]

  • 20.6 usec: map(myBigList.__getitem__, (87, 342, 217, 998, 500))

  • 22.7 usecです。 itemgetter(87, 342, 217, 998, 500)(myBigList)

  • 24.6ユーザック list( myBigList[i] for i in [87, 342, 217, 998, 500] )

なお、Python3では、1stが4thと同じになるように変更されています。


もう一つの選択肢は、最初に 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 は、それらがスライスであるため、同じようには動作しません。