搜索重合数据时避免排列

时间:2012-03-24 02:59:03

标签: python

我有这些数据:

1,           0.,           0.,        1500.
.
.     
21,           0.,        2000.,        1500.
22,           0.,        2100.,        1500.

我已经附加到名为nodes的节点:nodes [node ID,coord。 x,coord。 y,coord。 Z]。

现在我想找到重合的节点。所以我试过了:

for data in nodes:
    for data2 in nodes:
        if data2[1]==data[1] and data2[2]==data[2] and data2[3]==data[3] and data[0]<>data2[0]:
            coincident_nodes.append((data[0],data2[0])) 

我得到的结果是:例如:(31,32)和(32,31),我只想要(31,32)或(32,31),只有一个组合。

非常感谢。

2 个答案:

答案 0 :(得分:2)

当存在多个节点时,这样的事情会快得多

from collections import defaultdict

nd = defaultdict(list)

for item in nodes:
    nd[tuple(item[1:])].append(item[0])

coincident_nodes = [v for k,v in nd.items() if len(v)>1]

答案 1 :(得分:1)

如果可以在最后设置一个集合,则可以在生成的列表中执行此操作:

>>> a = [(1, 2), (2, 1), (3, 4), (5, 6), (4, 3), (1, 2), (1, 2)]
>>> set([tuple(sorted(e)) for e in a])
set([(1, 2), (5, 6), (3, 4)])

这是另一种通过删除重复项使其独一无二的方法:

>>> a = [(1,2),(2,1),(3,4),(5,6),(4,3)]
>>> uniq = set()
>>> for e in a:
...   if (e not in uniq) and ((e[1], e[0]) not in uniq):
...     uniq.add(e)
... 
>>> uniq
set([(1, 2), (5, 6), (3, 4)])

这假定没有重复项(即如果你有(x, y),那么你最多只有一次)。如果有,只需按照以下方式制作:

>>> a = [(1,2),(2,1),(3,4),(5,6),(4,3),(1,2),(1,2)]
>>> uniq = set()
>>> for e in a:
...   if (e not in uniq) and ((e[1], e[0]) not in uniq):
...     uniq.add(e)
... 
>>> print uniq
set([(1, 2), (5, 6), (3, 4)])