初始化列表到一个循环内的字典中的变量
问题描述:
我一直在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]
我希望我的问题很清楚,有人可以帮助我解决这个问题。
谢谢。
答
您的代码未将元素附加到列表中;而是用单个元素替换列表。要访问现有字典中的值,必须使用索引,而不是属性查找(item['name']
,而不是item.name
)。
from collections import defaultdict
example_dictionary = defaultdict(list)
for item in root_values:
example_dictionary[item['name']].append(item['value'])
defaultdict
是dict
子类,使用__missing__
hook on dict
为自动Materialise的值,如果该键不还的映射存在。
example_dictionary = {}
for item in root_values:
example_dictionary.setdefault(item['name'], []).append(item['value'])
答
列表和字典推导可以帮助这里...
鉴于
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]}