2011-11-26 76 views
4

我用Python創建了像這樣兩個列表:兩個列表成爲一個字典

list1 = [2, 3, 3, 4, 4, 5] 
list2 = [-4, 8, -4, 8, -1, 2] 

現在我拉上這兩個列表成爲一個字典,像這樣:

d = dict(zip(list1, list2)) 

這給了我:

{2: -4, 3: -4, 4: -1, 5: 2} 

我想得到的結果是這樣的:

{2: -4, 3: 4, 4: 7, 5: 2} 

list1正在成爲新詞典的關鍵。如果我在list1中有兩個相同的值,我希望它添加兩個值。例如,在列表2,8和-4都具有相同的鍵3.是否有辦法將這兩個值加在一起所以關鍵的模樣

{3: 4} 

回答

10

我想你想SOMET hing是這樣的:

>>> list1 = [2, 3, 3, 4, 4, 5] 
>>> list2 = [-4, 8, -4, 8, -1, 2] 

>>> d = {} 
>>> for k, v in zip(list1, list2): 
     d[k] = d.get(k, 0) + v 

>>> d 
{2: -4, 3: 4, 4: 7, 5: 2} 
+1

+1我更喜歡defaultdict,因爲它表達了意圖,但是你對於初學者更容易理解'get'有所幫助。 –

+0

謝謝,這個工作完美。我甚至沒有想過用get。另一個問題是,我知道詞典是無序的,但是能否顯示從最高鍵到最低鍵的詞典? – me45

+2

@ user1067296查看排序結果的最簡單方法是「print sorted(d.items(),reverse = True)''。 –

7

嘗試使用defaultdict

from collections import defaultdict 

d = defaultdict(int) 
for k, v in zip(list1, list2): 
    d[k] += v 

結果:

 
defaultdict(<type 'int'>, {2: -4, 3: 4, 4: 7, 5: 2}) 

看到它聯機工作:ideone

+3

這是一個很好的答案,但我認爲初學者需要在被引入* collections.defaultdict *之前暴露給* dict.get()*。前者爲核心數據類型打下堅實的基礎。後者需要知道工廠函數,知道* int()*沒有參數返回零,並且生成的defaultdict顯示不同於普通字典。 –

0

只要記住,當你排序時,你會產生很大的成本(O(nlogn))。也很可能有一個O(n)臨時空間(內存)的使用。字典被設計爲最好地完成一項工作 - 這是快速查找/添加/刪除 - 不按照排序順序遍歷所有項目(以未排序的順序行走仍然很好)。對於少數項目,這不是問題。瞭解其優勢和侷限性,確定正確的數據結構是很好的。還有其他的數據結構,如樹,可以提供有序的步行而不需要很高的成本(它們可以在O(n)中完成)。