如何在python 2中存储和访问密钥?

时间:2016-06-23 02:50:24

标签: python python-2.7 dictionary depth-first-search

我试图在python中实现DFS和BFS。我有深度优先搜索的代码,它可以工作,我几乎可以理解它。

我不明白的是如何访问密钥。程序可以选择G.keys()中的任何键,但它总是最终选择图中的下一个相邻键。由于我将Graph存储为字典,程序如何知道接下来要选择哪个键。是随机发生还是有特定原因?请帮助我理解内部工作。



Graph={'A':['B','G','D'],
	'B':['E','F'],
	'C':['F','H'],
	'D':['A','F'],
	'E':['B','G'],
	'F':['B','D','C'],
	'G':['E','A'],
	'H':['C']}


def traverse(G,node,visited):
	visited[node]=True
	print 'node:'+node+
	for other_nodes in G[node]:
		if other_nodes not in visited:
			traverse(G,other_nodes,visited)

def start_traversal(G):
	visited={}
	for node in G.keys():
		if node not in visited:
			traverse(G,node,visited)

start_traversal(Graph)




3 个答案:

答案 0 :(得分:0)

字典的存储倾向于按其键的散列顺序排列,但这并不能保证。你可以看到,在你的特定例子中,哈希都与角色有关。

>>> for x in 'ABCDEFGH':
    print hash(x)

-269909568
-141909181
-13908798
114091589
242091972
370092359
498092742
626093129

如果您需要指定字典的确切顺序,则可以使用OrderedDict

答案 1 :(得分:0)

start_traversal不是选择相邻密钥的位置。这是traverse中的部分,特别是for other_nodes in G[node]:。由于G[node]仅包含相邻节点,因此所有节点都将被迭代。

for node in G.keys():做的是选择一个随机节点开始(以及以下节点,以防G中有多个断开连接的子图)。

在这种情况下,选择相邻节点与哈希顺序没有任何关系(你永远不应该依赖它)。

答案 2 :(得分:0)

首先,他们的程序中出现错误:13 col:19必须是 print'node:'+ node

你想要输出在同一行,你可以在节点

之后添加一个逗号 第二件事是字典按照键的ascii值的排序顺序存储元素

但是在你的程序中发生的事情是在第20行,节点是'A',当你试图遍历它时,然后在第14行,other_nodes成为列表中的一个值,存储为键'A'的值,即'B'因为'B'也是一个关键,所以在另一个步骤中,other_nodes将是'E'then“E”作为“B”的键,但是已经被访问了所以它变为“G”并且过程一直持续到这个递归结束的时间所有密钥都出现在访问列表中,因此结果是无序的。