我有这些数据:
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),只有一个组合。
非常感谢。
答案 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)])