2014-04-01 63 views
6

我一直在Python工作了一段時間,我已經使用「嘗試」和「除了」解決了這個問題,但我想知道是否有另一種方法來解決它。初始化列表到一個循環內的字典中的變量

基本上我想創建這樣一個字典:

example_dictionary = {"red":[2,3,4],"blue":[6,7,8],"orange":[10,11,12]} 

所以,如果我有以下內容的變量:

root_values = [{"name":"red","value":2},{"name":"red","value":3},{"name":"red","value":4},{"blue":6}...] 

我的方式來實施example_dictionary是:

example_dictionary = {} 
for item in root_values: 
    try: 
     example_dictionary[item.name].append(item.value) 
    except: 
     example_dictionary[item.name] =[item.value] 

我希望我的問題很清楚,有人可以幫助我解決這個問題。

謝謝。

回答

16

您的代碼未將元素附加到列表中;而是用單個元素替換列表。要訪問現有字典中的值,必須使用索引,而不是屬性查找(item['name'],而不是item.name)。

使用collections.defaultdict()

from collections import defaultdict 

example_dictionary = defaultdict(list) 
for item in root_values: 
    example_dictionary[item['name']].append(item['value']) 

defaultdictdict子類,使用__missing__ hook on dict爲自動Materialise的值,如果該鍵不還的映射存在。

或使用dict.setdefault()

example_dictionary = {} 
for item in root_values: 
    example_dictionary.setdefault(item['name'], []).append(item['value']) 
0

列表和字典推導可以幫助這裏...

鑑於

In [72]: root_values 
Out[72]: 
[{'name': 'red', 'value': 2}, 
{'name': 'red', 'value': 3}, 
{'name': 'red', 'value': 2}, 
{'name': 'green', 'value': 7}, 
{'name': 'green', 'value': 8}, 
{'name': 'green', 'value': 9}, 
{'name': 'blue', 'value': 4}, 
{'name': 'blue', 'value': 4}, 
{'name': 'blue', 'value': 4}] 

如下圖所示可以提取具有特定名稱值item()的函數:

In [75]: def item(x): return [m['value'] for m in root_values if m['name']==x] 
In [76]: item('red') 
Out[76]: [2, 3, 2] 

然後,它只是一個字典理解的問題...

In [77]: {x:item(x) for x in ['red', 'green', 'blue'] } 
Out[77]: {'blue': [4, 4, 4], 'green': [7, 8, 9], 'red': [2, 3, 2]}