web-dev-qa-db-ja.com

特定のインデックスを持つpythonリストからアイテムを選択する

Pythonでこれを行うには良い方法があると確信していますが、私はその言語にかなり慣れているので、これが簡単なものであるかどうかは許してください!

リストがあり、そのリストから特定の値を取り出したいのですが。私が選びたい値は、リスト内のインデックスが別のリストで指定されているものです。

例えば:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]

出力は次のようになります。

[9, 2, 6]

(つまり、main_listのインデックス2、4、5の要素)。

これはリスト内包表記のようなものを使用して実行できるはずだと感じていますが、理解できません(特に、リスト内包表記を使用しているときにアイテムのインデックスにアクセスする方法がわかりません)。

26
Ben
[main_list[x] for x in indexes]

これは、リスト内包表記を使用して、オブジェクトのリストを返します。

86
t = []
for i in indexes:
    t.append(main_list[i])
return t
4
Yuval Adam

Yuval Aのソリューションはかなり明確でシンプルだと思います。しかし、実際に1行のリストを理解したい場合は、次のようにします。

[e for i, e in enumerate(main_list) if i in indexes]
2
unbeknown
map(lambda x:main_list[x],indexes)
1
Rubén Morales

リスト内包表記の代わりに、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に渡す必要はありません。

0
jpp