我有一个创建节点图/地图的任务。
GRAPH = {}
""" ===================================================================
This function makes a network out of the two nodes
node1, node2 and puts them in a dictionary: graph
---------------------
node1 : Dictionary
key: node2 [neighbouring node]
value: 1
---------------------
node2 : Dictionary
key: node1 [neighbouring node]
value: 1
===================================================================== """
def make_link(graph, node1, node2):
if node1 not in graph:
graph[node1] = {}
(graph[node1])[node2] = 1
if node2 not in graph:
graph[node2] = {}
(graph[node2])[node1] = 1
return graph
flights = []
flights.append(("LAX","DFW"))
flights.append(("SAE","LAX"))
flights.append(("ORD","LAX"))
flights.append(("ORD","SAE"))
for (x,y) in flights:
make_link(GRAPH, x, y)
print GRAPH
输出:
codewingx@CodeLair:~/repo/python/Graphs$ python map.py
{'DFW': {'LAX': 1}, 'LAX': {'DFW': 1, 'ORD': 1, 'SAE': 1}, 'ORD': {'LAX': 1, 'SAE': 1}, 'SAE': {'ORD': 1, 'LAX': 1}}
我发现它是多余的,因为只有连接的节点的值为1.
Q1。我不应该使用连接节点列表而不是内部字典吗? 喜欢:
{'DFW': ['LAX'], 'LAX': ['DFW', 'ORD', 'SAE'], 'ORD':['LAX','SAE'],'SAE':['ORD','LAX']}
Q2。我是否应该添加所有节点并在连接其他0时给它们值1?
答案 0 :(得分:1)
Q1:不会。对于会员资格测试,列表的字典会更慢。您可以使用set的dict来避免冗余1值。
但是,在使用图表时,我们经常需要与节点和边缘关联的额外信息("标签","着色")。例如。在您的示例中,您可以存储每条边的航班价格或持续时间 - 它自然会取代1。
(这适用于有向图,其中LAX-> SAE和SAE-> LAX价格是独立的。无向图是更难实现的;一个巧妙的技巧是一个字典,其键是2元素frozenset;但复制数据可能最简单。)
Q2:没有理由浪费(大多数图表的边缘远小于n ** 2)并且在动态添加/删除节点时很难维护。您可以使用collections.defaultdict(int)
模拟 0,无论您在哪里存储1(警告:它会在访问时 存储 0)但我建议仅查看node2 in graph[node1]
进行连接性检查,并留下graph[node1][node2]
以获取额外的边缘数据(如果有)。