从Python列表中删除图形中的重复边

时间:2016-07-24 18:30:46

标签: python

我的程序返回一个元组列表,它们代表图形的边缘,形式为:

[(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]

4 个答案:

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

反转矢量并在遍历时删除它们