2015-03-02 50 views
2

我有一個集合,看起來像這樣:使用序列中的列表值創建字典的最乾淨(大多數Pythonic)方法是什麼?

stuff = [('key1', 1), ('key2', 2), ('key3', 3), 
     ('key1', 11), ('key2', 22), ('key3', 33), 
     ('key1', 111), ('key2', 222), ('key3', 333), 
     ] 
# Note: values aren't actually that nice. That would make this easy. 

我希望把它變成看起來像這樣一本字典:

dict_stuff = {'key1': [1, 11, 111], 
       'key2': [2, 22, 222], 
       'key3': [3, 33, 333], 
       } 

什麼是將此數據轉換的最好方法是什麼?首先想到的方法是:

dict_stuff = {} 
for k,v in stuff: 
    dict[k] = dict.get(k, []) 
    dict[k].append(v) 

這是乾淨的方法嗎?

+0

如果'stuff'是保證被 「重點」 進行排序,我會用'itertools.groupby'。由於看起來並非如此,'collections.defaultdict'可能是您的下一個最佳選擇(如答案中所示) – mgilson 2015-03-02 21:52:12

回答

2

您可以使用dict.setdefault,這樣

dict_stuff = {} 
for key, value in stuff: 
    dict_stuff.setdefault(key, []).append(value) 

它說的是,如果key不存在於字典,然後用第二個參數作爲它的默認值,否則返回實際值對應於key

我們還有一個內置的dict類,它可以幫助您處理類似的情況,稱爲collections.defaultdict

from collections import defaultdict 
dict_stuff = defaultdict(list) 
for key, value in stuff: 
    dict_stuff[key].append(value) 

在這裏,如果key沒有在defaultdict對象存在,傳遞給defaultdict構造工廠函數將被調用,以創造的價值目標。

1

collections lib中有defaultdict

>>> from collections import defaultdict 
>>> dict_stuff = defaultdict(list) # this will make the value for new keys become default to an empty list 
>>> stuff = [('key1', 1), ('key2', 2), ('key3', 3), 
...   ('key1', 11), ('key2', 22), ('key3', 33), 
...   ('key1', 111), ('key2', 222), ('key3', 333), 
...   ] 
>>> 
>>> for k, v in stuff: 
...  dict_stuff[k].append(v) 
... 
>>> dict_stuff 
defaultdict(<type 'list'>, {'key3': [3, 33, 333], 'key2': [2, 22, 222], 'key1': [1, 11, 111]}) 
+2

請注意,如果稍後您想要關閉默認字典的「默認」行爲,你只需要將'default_factory'屬性設置爲'None'。例如'dict_stuff.default_factory = None' – mgilson 2015-03-02 21:50:42

0
stuff_dict = {} 
for k, v in stuff: 
    if stuff_dict.has_key(k): 
     stuff_dict[k].append(v) 
    else: 
     stuff_dict[k] = [v] 


print stuff_dict 
{'key3': [3, 33, 333], 'key2': [2, 22, 222], 'key1': [1, 11, 111]} 
+0

'has_key'已被棄用,你可以簡單地做'如果k在stuff_dict:' – thefourtheye 2015-03-03 01:23:40

相關問題