2012-01-17 81 views
1

我正在尋找使用字典處理某些數據輸出的最聰明方式。我有一個獨特的鍵,它將其他值相關聯,例如我們有1:[2,3,4,7],2:[8,9,5]。我想要做的是能追加值,使得第一個關鍵,我可以添加的號碼13,並得到如下:將值附加到Python中的字典中

1:[2, 3, 4, 7, 13], 2:[8, 9, 5] 

追加似乎並沒有這樣做的最聰明的方式。我使用:

dict[master = dict[master].append(id) 

,但我得到以下幾點:

AttributeError的:「詮釋」對象有沒有屬性「追加」

現在我可以簡單地拿他們鍵的舊值和簡單做到以下幾點(ID = 17):

newvalue = values, id

,但這會導致額外的括號,如

1:[[2, 3, 4, 7, 13], 17] 

什麼是確保我只得到數字在一組括號,即

1:[2, 3, 4, 7, 13, 17] 

我可以使用一些剝離功能最聰明的方式 - 但有一個好簡單的方法和這樣做的簡單方法。我可能在這裏忽略簡單的事情。提前致謝。

回答

4

列表是可變的。只要改變它就位。

dict[master].append(id) 
1

(1)創建一個類來包裝這件事(甚至更好,代替dict的使用defaultdict(deque),通過@kindall的建議;只有當您需要比這更需要一個新的類爲您提供)

(2)使用deque作爲的值,每條目在您的字典中,甚至是空值或單值條目,並附加到該雙端隊列中。 deque意圖在兩端都有恆定的時間追加; list實際上是一個向量。

+0

我不明白這個答案的重點。爲什麼有人要爲內置類完美處理的東西寫一個自定義類?爲什麼OP應該使用'deque',如果他想要的只是在最後追加? –

+0

@SvenMarnach:正如所解釋的,與列表不同的是,deque提供了最後的持續時間追加。他應該把它包起來,因爲他的數據結構不是字典 - 它是一個包含對象列表的字典。通過創建一個班級,他可以做一些事情,例如確保他所依賴的不變量可以依靠。你知道,同樣的原因,我們不僅爲所有事物使用了字典,而且也有類。 – Marcin

+0

列表支持(分期付款)恆定時間追加,所以我仍然沒有看到'deque'的點。當然,一個deque將比這個應用程序的列表慢。而且我仍然不認爲「創建一個班級來包裝它」的答案在任何方面都是有幫助的(沒有任何意圖)。 –

6

使用一個collections.defaultdict(和,wottthehell,使每個條目的collections.deque只是爲了好玩,你也可以使用過程中的一個普通舊list)。

from collections import defaultdict, deque 

d = defaultdict(deque) # or ...(list) 

d[1].append(2) 
d[1].extend([3, 4, 7, 13]) 

這裏的基本想法是,你的字典值總是deque S和你總是追加到他們,所以你永遠不必擔心值是否是一個int。如果使用字典中不存在的密鑰,defaultdict會自動爲您創建一個新的deque,因此您無需檢查密鑰是否已存在於字典中。

如果你已經有一個帶有單個int值的常規詞典 - 說它是你調用的某個函數的返回值 - 你可以使用該詞典來構建你的新詞典,重新做它。

d = defaultdict(deque) 
for key, value in old_d.iteritems(): 
    d[key].append(value) 
+0

我只是輸入'defaultdict'的答案,但你太快了。 +1 –

+0

謝謝你。這看起來像我試圖達到的行爲。然而,我們需要運行的所有機器都是Python 2.4,並且我認爲defaultdict在2.5之前不可用。我現在正在進行升級... – Androidian

+0

有沒有一種聰明的方式與defaultdict使用interitems?例程現在似乎不起作用。 – Androidian