我有一个列表 - 我们称之为'目录' - 对象属性。不同的对象可以具有不同数量的属性;例如,第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数据结构,在实践中使用它们证明有点挑战。
答案 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'}, ...]