Pythonでこれを行うには良い方法があると確信していますが、私はその言語にかなり慣れているので、これが簡単なものであるかどうかは許してください!
リストがあり、そのリストから特定の値を取り出したいのですが。私が選びたい値は、リスト内のインデックスが別のリストで指定されているものです。
例えば:
indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]
出力は次のようになります。
[9, 2, 6]
(つまり、main_listのインデックス2、4、5の要素)。
これはリスト内包表記のようなものを使用して実行できるはずだと感じていますが、理解できません(特に、リスト内包表記を使用しているときにアイテムのインデックスにアクセスする方法がわかりません)。
[main_list[x] for x in indexes]
これは、リスト内包表記を使用して、オブジェクトのリストを返します。
t = []
for i in indexes:
t.append(main_list[i])
return t
Yuval Aのソリューションはかなり明確でシンプルだと思います。しかし、実際に1行のリストを理解したい場合は、次のようにします。
[e for i, e in enumerate(main_list) if i in indexes]
map(lambda x:main_list[x],indexes)
リスト内包表記の代わりに、map
を_list.__getitem__
_とともに使用できます。大きなリストの場合、パフォーマンスが向上するはずです。
_import random
n = 10**7
L = list(range(n))
idx = random.sample(range(n), int(n/10))
x = [L[x] for x in idx]
y = list(map(L.__getitem__, idx))
assert all(i==j for i, j in Zip(x, y))
%timeit [L[x] for x in idx] # 474 ms per loop
%timeit list(map(L.__getitem__, idx)) # 417 ms per loop
_
遅延イテレータの場合は、map(L.__getitem__, idx)
を使用できます。 Python 2.7、map
はリストを返すため、list
に渡す必要はありません。