我的程序返回一个元组列表,它们代表图形的边缘,形式为:
[(i, (e, 130)), (e, (i, 130)), (g, (a, 65)), (g, (d, 15)), (a, (g, 65))]
所以,(i,(e,130))意味着' i'连接到' e'距离130个单位。
同样地,(e,(i,130))意味着' e'连接到' i'距离130个单位。 基本上,这两个元组都代表着相同的东西。
如何从此列表中删除其中任何一个? 期望的输出:
[(i, (e, 130)), (g, (a, 65)), (g, (d, 15))]
我尝试编写一个equals函数。这会有任何帮助吗?
def edge_equal(edge_tuple1, edge_tuple2):
return edge_tuple1[0] == edge_tuple2[1][0] and edge_tuple2[0] == edge_tuple1[1][0]
答案 0 :(得分:7)
如果元组(n1, (n2, distance))
表示双向连接,我将引入规范化属性,它限制元组中两个节点的排序。这样,每个可能的边都只有一个唯一的表示。
因此,规范化函数会将给定的,可能未规范化的边缘映射到规范化变体。然后,此函数可用于标准化所有给定边。现在可以通过多种方式消除重复项。例如,将列表转换为集合。
def normalize(edge):
n1, (n2, dist) = edge
if n1 > n2: # use a custom compare function if desired
n1, n2 = n2, n1
return (n1, (n2, dist))
edges = [('i', ('e', 130)), ('e', ('i', 130)), ('g', ('a', 65)), ('g', ('d', 15)), ('a', ('g', 65))]
unique_edges = set(map(normalize, edges))
# set([('e', ('i', 130)), ('d', ('g', 15)), ('a', ('g', 65))])
答案 1 :(得分:3)
重建每条边以采用其替代形式,并检查替代形式是否已在新集中。如果不是,则添加到集合中:
lst = [('i', ('e', 130)), ('e', ('i', 130)), ('g', ('a', 65)), ('g', ('d', 15)), ('a', ('g', 65))]
r = set()
for e, v in lst:
if (v[0], (e, v[1])) in r:
continue
r.add((e, v))
print(list(r))
# [('i', ('e', 130)), ('g', ('a', 65)), ('g', ('d', 15))]
答案 2 :(得分:2)
最简单的写入解决方案只是迭代器并检查所有这些的相等性:
def edge_equal(edge_tuple1, edge_tuple2):
return edge_tuple1[0] == edge_tuple2[1][0] and edge_tuple2[0] == edge_t\
uple1[1][0]
new = []
for i in range(len(graph)):
found_equal = False
for e in range(i,len(graph)):
if edge_equal(graph[i],graph[e]):
found_equal = True
break
if not found_equal:
new.append(graph[i])
print new
答案 3 :(得分:2)
edges = [(i, (e, 130)), (e, (i, 130)), (g, (a, 65)), (g, (d, 15)), (a, (g, 65))]
for each in edges:
try:
edges.remove((each[1][0], (each[0], each[1][1])))
except ValueError:
pass
反转矢量并在遍历时删除它们