2009-10-12 33 views
3

不同來源的字典編纂的數據時,這是一個常見的情況:在Python迭代過程中添加新密鑰或附加到字典中舊密鑰的最有效方法?

假設你有一個存儲的東西列出,比如事情的字典,我喜歡:

likes = { 
    'colors': ['blue','red','purple'], 
    'foods': ['apples', 'oranges'] 
} 

,並與一些相關的第二詞典值是:

favorites = { 
    'colors':'yellow', 
    'desserts':'ice cream' 
} 

然後你要遍歷「收藏夾」對象,無論是在該對象的項目進行適當的鍵追加到列表中的「喜歡」字典或添加新科y,它的值是一個包含「收藏夾」中的值的列表。

有幾種方法可以做到這一點:

for key in favorites: 
    if key in likes: 
     likes[key].append(favorites[key]) 
    else: 
     likes[key] = list(favorites[key]) 

for key in favorites: 
    try: 
     likes[key].append(favorites[key]) 
    except KeyError: 
     likes[key] = list(favorites[key]) 

還有更多,以及...

我一般用第一種語法,因爲它感覺更Python ,但如果還有其他更好的方法,我很想知道它們是什麼。謝謝!

回答

5

使用collections.defaultdict,其中默認值是一個新的list實例。

>>> import collections 
>>> mydict = collections.defaultdict(list) 

這樣調用.append(...)將始終成功,因爲在的情況下,不存在的關鍵append將一個新的空列表上調用。

您可以實例化defaultdict先前生成的列表,如果你從其他來源獲得的字典likes,就像這樣:

>>> mydict = collections.defaultdict(list, likes) 

注意,使用list作爲defaultdictdefault_factory屬性進行了討論作爲documentation的示例。

+0

2.5及更高版本,或者您必須定義您自己的defaultdict類。 – 2009-12-11 07:28:57

3

使用collections.defaultdict:

import collections 

likes = collections.defaultdict(list) 

for key, value in favorites.items(): 
    likes[key].append(value) 

defaultdict需要一個參數,一個工廠點播未知鍵創造價值。 list是一個這樣的函數,它創建空的列表。

並且迭代.items()將使您無法使用該鍵來獲取該值。

+0

使用.items()的好提示。這是我喜歡Python的東西之一。總有一種更好,更快,更智能的方式。 – 2009-10-12 09:21:45

1
>>> from collections import defaultdict 
>>> d = defaultdict(list, likes) 
>>> d 
defaultdict(<class 'list'>, {'colors': ['blue', 'red', 'purple'], 'foods': ['apples', 'oranges']}) 
>>> for i, j in favorites.items(): 
    d[i].append(j) 

>>> d 
defaultdict(<class 'list'>, {'desserts': ['ice cream'], 'colors': ['blue', 'red', 'purple', 'yellow'], 'foods': ['apples', 'oranges']}) 
2

除了defaultdict,常規字典提供了一種可能性(即可能看起來有點怪):dict.setdefault(k[, d])

for key, val in favorites.iteritems(): 
    likes.setdefault(key, []).append(val) 

感謝您代表的+20 - 我從1989年就到2009年在30秒內。讓我們記住,自從歐洲牆倒塌20年以來。

+0

啊,很好。 defaultdict在這裏似乎是「正確」的解決方案,但這是一個很酷的選擇。 – 2009-10-12 09:14:12

+2

請注意,http://docs.python.org/3.1/library/collections.html#defaultdict-examples中的第一個示例明確指出,使用'defaultdict'比使用'setdefault'方法快。 – Stephan202 2009-10-12 09:15:52

+0

也很高興知道。謝謝斯蒂芬。 – 2009-10-12 09:19:38

1

所有的答案是defaultdict,但我不確定這是最好的方式去做。給出defaultdict代碼,預計字典可能是壞的。 (請參閱:How do I make a defaultdict safe for unexpecting clients?)我個人對這個問題非常感興趣。 (我實際上發現這個問題尋找答案「哪個更好,dict.get()defaultdict」)另一個線程中的某個人表示,如果您不需要這種行爲,那麼您不需要defaultdict,那可能會是真實的。也許爲了方便使用defaultdict是錯誤的方法。我認爲這裏有兩個需要合併:

「我想要一個默認值爲空列表的字典。」 defaultdict(list)是正確的解決方案。

「我想在這個關鍵追加到列表中,如果它存在,如果不存在則創建一個列表。」 my_dict.get('foo', [])append()是答案。

你們認爲什麼?

相關問題