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

相关问题