2016-07-19 17 views
0

これはEfficient way to compare elements in 2 listsと似ていますが、基本的に質問に拡張があります。2つのリストの要素を効率的に比較する方法は?

は、私は二つのリストを持っていると言う:

a = [1,2,4,1,0,3,2] 
b = [0,1,2,3,4] 

要素がbの各要素に等しい私はaのインデックスを知りたいです。

たとえば、b[1]の出力例では、に[0,3]と出力されます。

データフレームの出力も同様に有用であろう、何かのように:

b = pd.DataFrame(b) 
a = pd.DataFrame(a) 
pd.merge(b.reset_index(),a.reset_index(), 
     left_on=b.columns.tolist(), 
     right_on = a.columns.tolist(), 
     suffixes = ('_b','_a'))['index_b','index_a']] 

しかし、私は、これはこれらがためのものですので、必要であればわからない午前:私は前に使用した何

b index_a 
    0  4 
    1  0 
    1  3 
    2  1 
    2  6 
    3  5 
    4  3 

リスト。 (以前私がデータフレームを扱っていたときにこの方法を使用しました)。

もっと多くのリストを使ってこの操作を何千回もやっているので、もっと効率的な方法があるのだろうかと思っています。また

誰もが、私はそれを大幅に感謝し、いくつかの入力を持っている場合は、bがちょうどlist(range(X))どここの場合X = 5

です!

おかげ

+1

は、我々は 'A'のすべての要素が 'B'に含まれることを前提とすることはできますか? –

+1

まあ、 'b'は役に立たない。実際の情報は単に「N」である。 '0..N-1'の範囲の値から' a'のインデックスまでのマッピングを作ることができます。このマッピングを構築するには、単に 'a'をループさせるだけです。 'b = list(range(N)) 'のため、' b'の値 'x'を持つ要素はインデックス' x'にあることに注意してください。実際には、マッピングがキーとして連続する整数を持つので、リストのリストで十分です: 'indices = [[] for _ in b]; for i、x in enumerate(a):indices [x] .append(i) ' – Bakuriu

+0

はい、申し訳ありません。 –

答えて

1
import collections 
dd=collections.defaultdict(list) 
for i,x in enumerate(a): 
    dd[x].append(i) 

>>> sorted(dd.items()) 
[(0, [4]), (1, [0, 3]), (2, [1, 6]), (3, [5]), (4, [2])] 
1

あなたはここに示すように、bは連続した整数をソートされている場合は、並べ替え、最も効果的なバケット。 それ以外の場合は、値bをキーとしてハッシュテーブルを構築し、aの値のリストを構築することができます。

2

非常にシンプルかつ効率的な解決策は、aのインデックスの範囲0..N-1の値からマッピングを構築することです。あなたがで終わるので、マッピングは、単純なリストになります

indices = [[] for _ in b] 
for i, x in enumerate(a): 
    indices[x].append(i) 

例の実行:b[i] == iはそうbリストを維持することはかなり無用であることを

>>> a = [1,2,4,1,0,3,2] 
>>> b = [0,1,2,3,4] 
>>> indices = [[] for _ in b] 
>>> for i,x in enumerate(a): 
...  indices[x].append(i) 
... 
>>> indices[1] 
[0, 3] 

注意。

+0

ああ、私は参照してください。私は「b」が役に立たないかもしれないと感じましたが、それ以外の方法はわかりませんでした。私が 'b 'を取り除くのであれば、例を提供してもいいですか? –

+0

@ GarrettMillerあなたが時間の前にbのサイズを知らないなら、私の答えは完璧です。もしそうすれば、 'indices = [[] in _ range(length)]'を初期化することができます。 –

+0

@GarrettMiller 'for _ in b 'を' for _ in range(N) 'または' for _ in [0] * N 'に変更する – Bakuriu

0

は、私は、これはあなたのニーズに十分に効率的であるかどうかわからないんだけど、これは動作します:

from collections import defaultdict 

indexes = defaultdict(set) 

a = [1,2,4,1,0,3,2] 
b = [0,1,2,3,4] 

for i, x in enumerate(a): 
    indexes[x].add(i) 

for x in b: 
    print b, indexes.get(x) 
関連する問題