【发布时间】:2019-06-07 17:05:14
【问题描述】:
我正在尝试实现一种返回图形边缘的方法,由邻接列表/字典表示。
所以要遍历字典,首先我遍历键,然后遍历存储在相应键中的每个值。在嵌套的 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()
输出是:
{('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) not in edges:"
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','B'),('A','C'),('A',' D')}
我很好奇为什么会这样,如果你们能向我解释一下,我将不胜感激。提前致谢!
【问题讨论】:
-
您的意思是
sort数据或使用带有排序数据的辅助集来避免插入。 key 和 adj_node 的类型是什么? -
无论如何检查都无关紧要,因为该集合只能包含每个值之一,因此您可以多次添加相同的值,并且您的集合的末尾仍然只有一个实例。
-
对不起,我忘了说(或强调,我想)我不是在问如何删除重复项!我只是想知道为什么当我更改 if 语句的条件时它忽略了重复项
-
没关系,我的评论与您的要求有些相干,但我仍然认为它是有效的。很可能我没有看到全貌,但我根本看不到检查的目的。
-
这么简单的解释是
set将只保存每个值的一个实例,而您使用if来检查相反方向的元组,因此实际上避免了两个方向的重复。
标签: python python-3.x data-structures