将List初始化为循环内的Dictionary中的变量

时间:2014-04-01 10:55:07

标签: python dictionary

我已经在Python工作了一段时间,我使用“try”和“except”解决了这个问题,但我想知道是否有另一种方法可以解决它。

基本上我想创建一个这样的字典:

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]

我希望我的问题很清楚,有人可以帮我解决这个问题。

感谢。

2 个答案:

答案 0 :(得分:23)

您的代码不会将元素附加到列表中;而是用单个元素替换列表。要访问现有词典中的值,您必须使用索引,而不是属性查找(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'])

defaultdict是一个dict子类,如果映射中尚不存在该键,则使用__missing__ hook on dict自动实现值。

或使用dict.setdefault()

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

答案 1 :(得分: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]}