2016-07-09 79 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 

我需要比較每個數組的第二項與每個其他數組的第一個項目,看他們是否相等。最好是以非常有效的方式。有沒有一種簡單而有效的方法來在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。如果一次比較只需要1ns,它仍然需要一整天。 – 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

我們可以在O(N)中做到這一點,假設python字典需要O(1)時間來插入和查找。

  1. 在第一掃描中,我們創建了一個地圖存儲第一數量和行索引通過掃描完整列表
  2. 在第二掃描中,我們發現,如果從第一掃描地圖包含的每一行的第二元件。如果地圖包含地圖的值,則會給出與所需標準匹配的行索引列表。
 
    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

相關問題