8

2つのリストの場合、

a = [1, 2, 9, 3, 8, ...]   (no duplicate values in a, but a is very big)
b = [1, 9, 1,...]          (set(b) is a subset of set(a), 1<<len(b)<<len(a)) 

indices = get_indices_of_a(a, b)

get_indices_of_aで戻る方法indices = [0, 2, 0,...]array(a)[indices] = ba.index時間がかかりすぎるを使用するよりも速い方法はありますか?

セットを作成bすることは、リストを照合してインデックスを返す高速な方法です(Pythonで2つのリストを比較し、一致した値のインデックスを返すを1参照)が、この場合、2番目のインデックスとインデックスのシーケンスが失われます。

4

2 に答える 2

13

高速な方法(aが大きなリストの場合)は、dictを使用して値aをインデックスにマップすることです。

>>> index_dict = dict((value, idx) for idx,value in enumerate(a))
>>> [index_dict[x] for x in b]
[0, 2, 0]

a.indexこれは、二次時間を要するを使用する場合と比較して、平均的な場合には線形の時間を要します。

于 2012-04-30T14:56:34.913 に答える
7

小さいリストで作業していると仮定すると、これは次のように簡単です。

>>> a = [1, 2, 9, 3, 8] 
>>> b = [1, 9, 1] 
>>> [a.index(item) for item in b]
[0, 2, 0]

より大きなリストでは、これはかなり高価になります。

(重複がある場合、最初のオカレンスは常に結果のリストで参照されているものになりますnot set(b) <= set(a)。の場合、ValueErrorが発生します)。

于 2012-04-30T14:50:49.093 に答える