2016-10-14 85 views
0

我需要建立這樣的基於用戶輸入代表向加權圖在Python創建權圖 -基於用戶輸入

graph = { 
      'a': {'b': 1, 'c': 4}, 
      'b': {'c': 3, 'd': 2, 'e': 2}, 
      'c': {}, 
      'd': {'b': 1, 'c': 5}, 
      'e': {'d': -2} 
     } 

到目前爲止,

import pprint 

graph = {} 
values = {} 
v = int(input("Enter number of vertices: ")) 

print("Enter vertices(keys) : ") 
for i in range(v): 
    graph.setdefault(input()) 

edges = {} 
for x in graph: 
    edges.setdefault(x) 

for i in graph: 
    graph[i] = edges 

print("Enter weights: ") 
for i in graph: 
    print(i) 
    for j in graph[i]: 
     var = input() 
     graph[i][j] = var 

pprint.pprint(graph) 

我試着但由於某些原因,它將用上次讀取的權重替換先前讀取的權重。任何解決方案

+1

任何企圖這麼遠? –

+0

你既沒有顯示你的輸入格式也沒有嘗試,但看看是否有幫助:http://stackoverflow.com/questions/38165292/how-to-convert-an-adjacency-matrix-to-an-adjacency-list -with-python/38165410#38165410 –

+0

而不是重新發明輪子 - 你可能想看看https://networkx.github.io/ –

回答

1
for i in graph: 
    graph[i] = edges 

你分配相同的字典(edges)至每個鍵。因此,當您爲其中任何一個值賦值時,您將該值分配給全部爲。它看起來像你真正想要的是副本edges。在這種情況下,因爲你還沒有分配任何可變值edges,淺表副本是足夠了:

for i in graph: 
    graph[i] = edges.copy() 
+0

它的工作!謝謝。然而,在進行輸入即對邊進行加權時,密鑰的順序是隨機的。它有時會要求任何頂點,而不是先插入的那個頂點,然後第二個等等。有什麼建議麼? – Abhishek

+1

@Ahhishek字典沒有秩序的概念。如果您需要以特定順序顯示項目,則需要自行排序。或者你可以探索[collections.OrderedDict](https://docs.python.org/3.5/library/collections.html#collections.OrderedDict)。 – glibdud

0

您是否有縮進錯誤?

而不是

for i in graph: 
    print(i) 
for j in graph[i]: 
    var = input() 
    graph[i][j] = var 

你或許打算寫

for i in graph: 
    print(i) 
    for j in graph[i]: 
     var = input() 
     graph[i][j] = var 

+0

謝謝,指出,這是一個錯誤。 – Abhishek