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') }
我非常好奇为什么会如此,如果你们能向我解释,我会非常感激.提前致谢!
当我们说集合没有订单或订单无关紧要时,就意味着{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)不会被添加到集合中.