Я пытаюсь реализовать метод, который возвращает ребра графа, представленного списком / словарем смежности.
Итак, для итерации по словарю сначала я итерировал по ключам, а затем по каждому значению, сохраненному в соответствующем ключе. Внутри вложенного цикла for у меня было условие, когда, если конкретное ребро, скажем, (a, b) не входит в набор ребер, добавьте его в набор - передайте иначе. В моем первом запуске метод получил ребра, которые одинаковы, то есть в наборе ребер есть (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()
вывод:
{( 'А', 'В'), ( 'D', 'A'), ( 'B', 'A'), ( 'B', 'E'), ( 'А',» D '), (' D ' 'C'), ( 'E', 'В'), ( 'C', 'D'), ( 'A', 'C'), ( 'C',' А ')}
Итак, я просто изменил выражение 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
Теперь вывод был:
{( 'C', 'D'), ( 'A', 'B'), ( 'E', 'В'), ( 'А', 'С'), ( 'А',» D ')}
Мне очень любопытно, почему это так, и я был бы так благодарен, если бы вы, ребята, смогли мне это объяснить. Заранее спасибо!