当我在集合中切换订单时,为什么我的代码采用不同的值(知道订单与集合无关)

Fra*_*son 8 python data-structures python-3.x

我正在尝试实现一个返回图形边缘的方法,由邻接列表/字典表示.

因此,为了遍历字典,首先我遍历键,然后遍历存储在相应键中的每个值.在嵌套的for循环中,我有一个条件,如果一个特定的边,说(a,b)不在边集中,那么将它添加到set - 否则.在我第一次运行时,该方法采用了相同的边 - 也就是说,在边集中,有(a,b)和(b,a).

class Graph():
    def __init__(self, grph={}):
        self.graph = grph

    def get_vertices(self):
        for keys in self.graph:
            yield keys

    def get_edges(self):
        edges = set()
        for key in self.graph:
            for adj_node in self.graph[key]:
                if (key, adj_node) not in edges:
                    edge = (key, adj_node)
                    edges.add(edge)
                else:
                    pass
        return edges


def main():
    graph1 = {
        'A': ['B','C','D'],
        'B': ['A','E'],
        'C': ['A', 'D'],
        'D': ['A', 'C'],
        'E': ['B'],
    }
    graph_one = Graph(graph1)
    print(list(graph_one.get_vertices()))
    print(graph_one.get_edges())

if __name__ =='__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

输出是:

{( 'A', 'B'),( 'd', 'A'),( 'B', 'A'),( 'B', 'E'),( 'A', 'd') ,( 'd', 'C'),( 'E', 'B'),( 'C', 'd'),( 'A', 'C'),( 'C', 'A') }

所以我做的是,我刚刚更改了if语句:

"if(adj_node,key)不在边缘:"

def get_edges(self):
        edges = set()
        for key in self.graph:
            for adj_node in self.graph[key]:
                if (adj_node, key) not in edges:
                    edge = (key, adj_node)
                    edges.add(edge)
                else:
                    pass
        return edges
Run Code Online (Sandbox Code Playgroud)

现在的输出是:

{( 'C', 'd'),( 'A', 'B'),( 'E', 'B'),( 'A', 'C'),( 'A', 'd') }

我非常好奇为什么会如此,如果你们能向我解释,我会非常感激.提前致谢!

Ale*_*all 9

当我们说集合没有订单或订单无关紧要时,就意味着{x, y} == {y, x}.但是(a, b)并且(b, a)是元组,对它们有意义,所以(a, b) != (b, a)因此它{(a, b), (b, a)}是一个有两个不同元素的集合,尽管它等于{(b, a), (a, b)}.

当您的代码如下所示:

        if (adj_node, key) not in edges:
            edge = (key, adj_node)
            edges.add(edge)
Run Code Online (Sandbox Code Playgroud)

然后当a <-> b第一次遇到边缘时,它就像(key, adj_node) == (a, b)并被添加到集合中.当它遇到第二个(也是唯一的其他)时间时,它就是(key, adj_node) == (b, a),意味着(adj_node, key) == (a, b)它已经在集合中,因此(adj_node, key) not in edges是假的并且(b, a)不会被添加到集合中.