将列表聚合/分组到字典

时间:2015-12-03 07:32:13

标签: python-2.7

我有一个列表 - 我们称之为'目录' - 对象属性。不同的对象可以具有不同数量的属性;例如,第1项和第2项具有“color”和“sizeid”,但第3项具有额外的“onsale”属性。

[{'item_id': 1, 'property_name': 'colour', 'property_value': 'blk'},
 {'item_id': 1, 'property_name': 'sizeid', 'property_value': '1'},
 {'item_id': 2, 'property_name': 'colour', 'property_value': 'grn'},
 {'item_id': 2, 'property_name': 'sizeid', 'property_value': '2'},
 {'item_id': 3, 'property_name': 'colour', 'property_value': 'blue'},
 {'item_id': 3, 'property_name': 'sizeid', 'property_value': '2'},
 {'item_id': 3, 'property_name': 'onsale', 'property_value': True}]

我希望能够基于item_id和property_name访问property_value,如下所示:

>>> print catalog[1]['sizeid']
>>> '1'
>>> print catalog[3]['onsale']
>>> True
>>> print catalog[2]['onsale']
>>> KeyError: 'onsale'

我有一个狡猾的计划,在程序上用

这样做
for i, val in enumerate(catalog):
    tidy_catalog[val['item_id']][val['property_name']] = val['property_value']

但是这没有用 - 可能有很多原因,但我认为主要是因为词典不允许重复值。

欣赏任何建议,甚至是有用的手册页 - 我坚持PHP的思维方式,而我认为我在概念层面上获得了Python数据结构,在实践中使用它们证明有点挑战。

2 个答案:

答案 0 :(得分:1)

这不起作用的原因是为不存在的键分配值 要解决此问题,您可以使用defaultdict

>>> tidy_catalog = collections.defaultdict(dict)
>>> for val in catalog:
...     tidy_catalog[val['item_id']][val['property_name']] = val['property_value']
...
>>> pp(tidy_catalog)
defaultdict(<type 'dict'>, {
    1: {'colour': 'blk', 'sizeid': '1'},
    2: {'colour': 'grn', 'sizeid': '2'},
    3: {'colour': 'blue', 'onsale': True, 'sizeid': '2'},
})

答案 1 :(得分:0)

考虑将目录数组调整为适当的字典数组,存储这些信息:

catalog = [{'item_d' : 1, 'colour' : 'blk', 'sizeid' : '1'}, ...]