2015-06-12 77 views
1

我想使用一個字典表示有一定數量的節點(num)和所有可能的邊緣(輸出)的有向圖。Python刪除方法靜音字典鍵

實例:

如果num = 1時,輸出:{0:組([])}

如果num = 2,輸出:{0:組([1]),1:集如果num = 3,則輸出:{0:set([1,2]),1:set([0,2]),2:set([0,1]))(012) }

如果num = 4,則輸出:{0:set([1,2,3]),1:set([0,2,3]),2:set([0,1,3] ),3:set([0,1,2])}

我的代碼將迭代th粗糙的詞典並在每個由溫帶列表中刪除鍵設置:

num = 3 
keys = range(0,num) 
mydict ={} 
for key in keys: 
    temp = keys 
    value_list = temp.remove(key) 
    mydict[key] = set([value_list]) 

,但它似乎使用temp.remove(鍵),不僅溫度,而且鍵就會減弱。這是爲什麼?

回答

1

您在Python中使用的大多數對象(不是像int這樣的基本類型)只是對實際數據的引用。這意味着在你的例子中,temp和keys都是指向相同數據的指針。

keys = range(0,num)    # Bind keys to a new list instance = [0, 1, 2, ..., num] 
mydict = {} 
for key in keys: 
    temp = keys     # Bind temp to the same dictionary as keys 
    value_list = temp.remove(key) # Remove from the list temp and keys point to 
    ... 

如果你想臨時指向一個獨特的名單中,有幾種方法可以做到這一點,但我更喜歡這樣的:

temp = list(keys) 

編輯: 根據the analysis done here通過低溫,這種奇怪的語法稍快(稱爲切片)

temp = list[:] 
+0

是的,解決了所有問題! – enaJ

+0

很高興聽到它!我不確定你是否收到通知,但我編輯了一些答案。結果發現有一個更快的方法來做你想做的事情。祝你好運! – Curmudgeon

+0

謝謝。我現在看到新的更新語法。另外,我不明白這一點:「在Python中使用的大多數對象(不是基元,像int)都只是對實際數據的引用」,儘管你的解決方案有助於解決這個問題。您能否在這方面擴大更多? – enaJ