2017-03-12 4 views
3

1または0の値を持ち、長さが1024のリストがあります。指定された2つのリストがすべてのインデックスで重複する回数を検索したいそれらが値== 1と一致すれば)、しかし比較の数を低く保つ方法を考えるように見えない。現在、私のアプローチは、値が== 1の私のリストのすべてのインデックスを取得し、2つのリストの交点を得ることです。インデックスの重複回数を取得する

#for each list, do the following 
for x,j in enumerate(list1): 
    if j == 1: 
     idx_list.append(x) 
# compare two lists 
num_overlap = set(idx_list1).intersection(idx_list2) 

この値を見つけるのが最も効率的な方法ですか?例えば、入力/出力のため

(のみ代わり1024 6つの値を示す):

list1 = [1 0 1 0 0 0] 
list2 = [1 0 0 0 0 0] 
num_overlap = 1 (both lists have ```1``` at index 0) 

答えて

6

だけzip一緒にリスト、およびリストの両方の要素が「truthy」であれば、それは(すべての非ゼロをだかどうかを確認するためにzip形式の結果にallを適用するには。問題1は、それはケースだ場合。ジェネレータの理解を合計。

list1 = [1,0,1,0,0,0] 
list2 = [1,0,0,0,0,0] 

num_overlap = sum(1 for t in zip(list1,list2) if all(t)) 

注:zipに供給することができリストの任意の数で動作します

バリアント:all(t)1に評価するので、コードは少し短くすることができ、そして私たちも避けるために、ここでmapを使用することができますループ:

num_overlap = sum(map(all,zip(list1,list2))) 

ベンチマークの両方の反復の多大のソリューション:

2.3228490352630615 (gencomp) 
2.1401889324188232 (map) 

そしてall

1.9283719062805176 

を呼び出してからのオーバーヘッドはありませんので、sum(x and y for x,y in zip(list1,list2))を使用して提案された解決策は高速です(あなたがしたい場合2つ以上のリストで一般化するには、最後のリストは使用できませんが、2つのリストしかない場合は、最も速いオプションです)

+3

ほんのわかりやすいバージョン(個人的に): 'sum(xとyはx、yはzip(list1、list2))'です。 – SuperSaiyan

+0

合意。また、私はジェネレータの表現がマップよりも実際に速いと信じています。 – idjaw

+0

リストが2つしかない場合、 'xとy'はおそらく速いでしょう。 –

2

もし回数にだけ興味がある場合は、numpyの配列を使用することができ、(製品が項目別でそれらを乗算)、その積を合計します。あなたが両方の配列中の対応するエントリはここで1であった場合にのみ生成物中に1を有することになる例である:その後

import numpy as np  
a=np.array([1,0,0,1]) 
b=np.array([1,0,1,0]) 
sum(a*b) 

*のB = [1,0,0,0]、及び和(* b)= 1である。

+0

質問は、これは効率的ですか? – Elmex80s

+3

ここでは、numpyが真剣に必要ですか?それは残酷です。これほど些細なことを解決するために 'numpy'をインストールすることを推奨するには、良いアドバイスのようには思えません。 – idjaw

+2

@ Elmex80sそれは効率的です... * numpyをインポートしたら*(そして 'sum(a == b)'がもっと明確になるかもしれません)。しかし、これだけのためにnumpyをインポートすることは間違いなく過度なものであり、ほとんど確実にずっと時間がかかるでしょう。 –

関連する問題