Python - 将列表中的每个项目与该列表中的每个其他项目进行比较

时间:2016-07-09 07:00:14

标签: python python-2.7

我需要将很长列表中的每个项目(12471个项目)与同一个列表中的每个其他项目进行比较。以下是我的清单:

[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

2 个答案:

答案 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]]

虽然这不会处理重复。

答案 1 :(得分:2)

我们可以在O(N)中做这个,假设python dict需要O(1)时间进行插入和查找。

  1. 在第一次扫描中,我们通过扫描完整列表
  2. 创建存储第一个数字和行索引的地图
  3. 在第二次扫描中,我们发现第一次扫描的地图是否包含每行的第二个元素。如果map包含,则map的值为我们提供符合所需标准的行索引列表。
  4.     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]]))