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']
私はそれを行う方法を知りません。しかし、 list comprehension を使用できます:
>>> [aList[i] for i in myIndices]
リスト内包表記を確実に使用しますが、これを行う関数があります(これを行う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')
リストによるインデックス作成は、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']
場合によっては、このソリューションはリストの理解よりも便利です。
map
を使用できます
map(aList.__getitem__, myIndices)
またはoperator.itemgetter
f = operator.itemgetter(*aList)
f(myIndices)
すべての要素に同時にアクセスするリストを必要とせず、サブリスト内のすべてのアイテムを繰り返し使用したい(またはそれらを渡すものにしたい)場合は、リスト内包表記ではなくジェネレータ式を使用する方が効率的です:
(aList[i] for i in myIndices)
私はこれらのソリューションに満足していなかったので、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']