web-dev-qa-db-ja.com

Python:インデックスによるリストのフィルタリング

In Python私は要素のリストaListとインデックスのリストmyIndicesを持っています。aListインデックスとしてmyIndicesの値を持っていますか?

例:

>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> myIndices = [0, 3, 4]
>>> aList.A_FUNCTION(myIndices)
['a', 'd', 'e']
38
Ricky Robinson

私はそれを行う方法を知りません。しかし、 list comprehension を使用できます:

>>> [aList[i] for i in myIndices]
71

リスト内包表記を確実に使用しますが、これを行う関数があります(これを行うlistのメソッドはありません)。ただし、これはitemgetterの不適切な使用ですが、知識のためだけにこれを投稿しました。

>>> from operator import itemgetter
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> my_indices = [0, 3, 4]
>>> itemgetter(*my_indices)(a_list)
('a', 'd', 'e')
10
jamylak

リストによるインデックス作成は、numpyで実行できます。ベースリストをnumpy配列に変換してから、別のリストをインデックスとして適用します。

>>> from numpy import array
>>> array(aList)[myIndices]
array(['a', 'd', 'e'], 
  dtype='|S1')

必要に応じて、最後にリストに変換して戻します。

>>> from numpy import array
>>> a = array(aList)[myIndices]
>>> list(a)
['a', 'd', 'e']

場合によっては、このソリューションはリストの理解よりも便利です。

5

mapを使用できます

map(aList.__getitem__, myIndices)

またはoperator.itemgetter

f = operator.itemgetter(*aList)
f(myIndices)
4
wenzul

すべての要素に同時にアクセスするリストを必要とせず、サブリスト内のすべてのアイテムを繰り返し使用したい(またはそれらを渡すものにしたい)場合は、リスト内包表記ではなくジェネレータ式を使用する方が効率的です:

(aList[i] for i in myIndices) 
3
watsonic

私はこれらのソリューションに満足していなかったので、Flexlistクラスを単純に拡張し、整数、スライス、またはインデックスリストによる柔軟なインデックス付けを可能にするlistクラスを作成しました。

class Flexlist(list):
    def __getitem__(self, keys):
        if isinstance(keys, (int, slice)): return list.__getitem__(self, keys)
        return [self[k] for k in keys]

次に、あなたの例では、あなたはそれを次のように使うことができます:

aList = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g'])
myIndices = [0, 3, 4]
vals = aList[myIndices]

print(vals)  # ['a', 'd', 'e']
2
jedwards