2015-05-13 30 views
3

我有一個itemList元組的序列(key, value)格式,我想將該列表中的項目轉換爲格式爲{key : [value, ..], ..}dict。一個特定的key值可能多次出現在itemList中,並且匹配的或新的value,我也想記錄這些值(這就是爲什麼簡單地使用dict(itemList)不起作用)。有沒有一種更簡潔的方式來將一個(鍵,值)元組序列轉換爲{key:[value,..],..}字典?

我使用Python2.7.9並尋找方法來小型化驗證碼:

newDict = dict() 
for k,v in itemList: # itemList contains the tuples described above. 
    if k in newDict: 
     newDict[k].append(v) 
    else: 
     newDict[k] = [v] 

我一直在使用相結合,並map()list-comprehensions嘗試newDict.update(..)但沒有制定出預期。

我看過this similar question,,但我的輸入和所需輸出的格式有很大不同。 (對於那些想知道的,「你爲什麼要改變這個完全可以接受的代碼?」:我有興趣找到更多的應用Python的內置插件和模塊作爲學術練習的替代方法,而不是有目的地避免一些功能和理解。)

回答

4

您可以使用dict.setdefault縮短你的代碼,這樣

newDict = {} 
for k, v in itemList: 
    newDict.setdefault(k, []).append(v) 

setdefault將尋找在字典中的關鍵,如果沒有找到它,它將會分配的第二個參數它並返回它。

如果在字典中找到密鑰,它將簡單地返回相應的值。


或者,你可以使用collections.defaultdict,這樣

from collections import defaultdict 

result = defaultdict(list) 
for k, v in itemList: 
    result[k].append(v) 

這類似於setdefault方法。如果在字典中沒有找到該鍵,則傳遞給defaultdict構造函數的函數將被調用以創建一個新值。

+0

這些都是非常有趣的方法!我以前用過'dict.get(SomeThing,dict())',但我沒有注意到'setdefault'! +1 我也許應該看一下'藏品',因爲我看到它很多,但一直在推遲它...... – Augusta

0

這一行可以代替張貼的代碼,但是很難閱讀。它可能不是很快,因爲它必須多次遍歷itemList

newDict = dict((k, [_v for _k,_v in itemList if _k == k]) for k in set(i[0] for i in itemList))

+2

這具有二次運行復雜性。如果'itemList'很大,它會變得非常低效。 – thefourtheye

+0

@thefourtheye我認爲在另一個迭代器中運行列表理解是非常困難的,是的......這只是我找到的解決方案。無可否認,這不是一個好的替代品。 XD – Augusta

+0

@thefourtheye這個修訂版本只遍歷唯一的'itemList'鍵(找到它們之後),而不是每個'itemList'項。這不是很好,但它好多了。 – Augusta

相關問題