2016-07-09 16 views
0

非常に長いリスト(12471項目)のすべての項目を同じリストの他のすべての項目と比較する必要があります。以下は私のリストです:Python - リストの各項目とそのリストの他のすべての項目を比較する

[array([3, 4, 5]) 
array([ 6, 8, 10]) 
array([ 9, 12, 15]) 
array([12, 16, 20]) 
array([15, 20, 25]) 
...]     #12471 items long 

私は、彼らが同じだかどうかを確認するために、他のすべての配列の最初の項目に各配列の2番目の項目を比較する必要があります。そして、好ましくは、非常に効率的な方法で。 Python 2.xでこれを行う簡単で効率的な方法はありますか?


私はここに非常に粗製の方法を働いたが、それはひどく遅いです:

ls=len(myList)  #12471 
l=ls 
k=0 
for i in myList: 
     k+=1 
     while l>=0: 
      l-=1 
      if i[1]==myList[l][0]: 
       #Do stuff 
     l=ls 
+1

ちょうどエンベロープ計算の背面の操作を行います。あなたが行うにはN^2の比較を持っているのn = 10^7。 1回の比較に1nsしかかからない場合は、1日もかかります。 – Julien

+0

これらの配列に含まれる値の範囲について知っていますか?それらの配列要素の可能な値に関する追加情報がありますか? – Kevin

+0

@ケビン彼らはすべてピタゴラスのトリプルです。私はそれが役立つかどうか分からない。 –

答えて

2

これは理論的にはまだあるN^2時間(最悪の場合)が、それは物事が少し改善する必要があります:私の簡単な、短い例

import collections 

inval = [[3, 4, 5], 
[ 6, 8, 10], 
[ 9, 12, 15], 
[ 12, 14, 15], 
[12, 16, 20], 
[ 6, 6, 10], 
[ 8, 8, 10], 
[15, 20, 25]] 

by_first = collections.defaultdict(list) 
by_second = collections.defaultdict(list) 

for item in inval: 
    by_first[item[0]].append(item) 
    by_second[item[1]].append(item) 

for k, vals in by_first.items(): 
    if k in by_second: 
     print "by first:", vals, "by second:", by_second[k] 

出力:

by first: [[6, 8, 10], [6, 6, 10]] by second: [[6, 6, 10]] 
by first: [[8, 8, 10]] by second: [[6, 8, 10], [8, 8, 10]] 
by first: [[12, 14, 15], [12, 16, 20]] by second: [[9, 12, 15]] 

これは重複を処理しませんが。

2

私は、python dictが挿入と参照のためにO(1)時間かかると仮定してO(N)でこれを行うことができます。最初のスキャンで

  1. 最初のスキャンからマップは、各列の第2の要素が含まれている場合、我々は2回目のスキャンでは、完全なリスト
  2. を走査することによって最初の数と行のインデックスを格納するマップを作成し、我々は見つけます。 mapが含まれている場合、mapの値は必要な基準に一致する行インデックスのリストを返します。
 
    myList = [[3, 4, 5], [ 6, 8, 10], [ 9, 12, 15], [12, 16, 20], [15, 20, 25]] 

    first_column = dict() 
    for idx, list in enumerate(myList): 
     if list[0] in first_column: 
      first_column[list[0]].append(idx) 
     else: 
      first_column[list[0]] = [idx] 

    for idx, list in enumerate(myList): 
     if list[1] in first_column: 
      print ('rows matching for element {} from row {} are {}'.format(list[1], idx, first_column[list[1]])) 
+0

すばらしい解決策! – Malcriado415

関連する問題