我尝试通过以下方式在 python 中模拟带有字典的图形:
G = {'a':{'b':3, 'c':4},
'b':{'a':3, 'c':5},
'c':{'a':4,'b':5},
}
其中 G 是一个字典,其键具有与之关联的字典值。反过来,这些键是具有相关权重的相邻节点作为它们的值。
我已经尝试过使用这段代码,但是我没有达到我的目标
def generarGrafo(num_nodos):
lista_nodos = []
lista_nodos_asociados = []
grafo = {}
for i in range(num_nodos):
nodo = raw_input(" ID Nodo %d:" %(i+1))
lista_nodos.append(nodo)
num_nodos_asociados = input(" Numero de nodos asociados a nodo '%s':" %(lista_nodos[i]))
lista_nodos_asociados.append([]) #Lista de listas para almacenar los nodos asociados a cada respectivo nodo i-esimo
for j in range(num_nodos_asociados):
nodo_asociado = raw_input(" ID nodo %d asociado:" %(j+1))
lista_nodos_asociados[i].append(nodo_asociado) #Se almacenan y muestran en el elemento i-esimo de la lista
peso_asociado = input(" Peso asociado (Arista(%s,%s) ): " %(lista_nodos[i],lista_nodos_asociados[i][j] ) )
grafo[lista_nodos[i]] = {}
grafo[lista_nodos[i]][lista_nodos_asociados[i][j]] = peso_asociado
return grafo
我得到以下输出: G = {'a':{'c':4}, 'b':{'c':5}, 'c':{'b':5}, }
由于某种原因,它只将第二项放在关联节点列表中,
问题出在用于生成关联节点的 for 循环中,特别是在以下行中:
使用它,您可以在 for 的每次迭代中创建一个新的键/值对,因为字典具有唯一的键,这会删除前一个键,以便最终只保存您输入的最后一个关联节点。解决方法很简单,从 for 中去掉这一行,在开始之前放上:
这是执行:
另一方面,就目前而言,该函数效率非常低,不需要这两个列表,并且从它们中读取以创建字典比直接使用输入值要慢得多。您可以简化代码以使其更高效,以下函数也是如此:
如果真正的功能与你发布的不同,如果你使用列表,我建议你用输入值创建字典,而不是获取对应列表的值。