2012-08-07 9 views
26

私は、要素のリストaListとインデックスのリストmyIndicesを持っています。一度にすべてを取得できる方法はありますかaListの項目には、値が添え字としてmyIndicesにありますか?Python:インデックスによるリストのフィルタリング

例:私はそれを行うための任意の方法を知らない

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

'[aListの[i]はiに対するmyIndi​​ces中]' – Morwenn

+3

あなただけの要素を反復処理したい場合は、私が代わりにジェネレータ式を使用することをお勧め: '(aList [i] for myIndi​​ces) ' – hochl

答えて

52

。しかし、あなたはlist comprehensionを使用することができます。

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

は間違いなく、リストの内包表記を使用しますが、ここでそれをしない関数は、(これを行う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') 
+0

私はこれが正しいケースではないと信じています'itemgetter'を使います。 –

+0

@BasicWolfはい、あなたはそれを使用すべきではありませんが、OPはこれを行うことができる機能を求めました。私はあなたがこれを使用すべきでないことをより明示します。 – jamylak

+0

これは、関数が持つことができる引数の最大数の制限によっても制限されると思います。 – Paddy3118

5

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'] 

このソリューションは、することができますリストの理解よりも便利です。

1

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

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'] 
+0

これは非常に便利です。 – mikeTronix

4

map

map(aList.__getitem__, myIndices) 

またはoperator.itemgetter

f = operator.itemgetter(*aList) 
f(myIndices) 
2

あなたはすべての要素への同時アクセスリストが必要ですが、ちょうど繰り返しサブリスト内のすべてのアイテムを使用したい(または何かに渡す)していない場合は、そのむしろリストよりジェネレータ式を使用する方が効率的理解:

(aList[i] for i in myIndices) 
関連する問題