从记录重复的词典列表中查找属性

时间:2017-01-13 19:22:37

标签: python

我有一个dicts列表。我希望通过字段id找到所有唯一记录,并从各种不同的事件中获取不同的属性。

原始清单:

[{"id": "chehjkndskns", "att_a" : 12, "time" : 4},{"id": "chehjkndskns", "att_a" : 15, "time" : 5}, {"id": "sjnd", "att_a" : 14, "time" : 4},{"id": "sjnd", "att_a" : 166, "time" : 5}]

期望的结果:

[{"id": "chehjkndskns", "attributes" : [{"att_a" : 12, "time" :4},{"att_a" : 15, "time" : 5}], {"id": "sjnd", "attributes" : [{"att_a" : 14, "time" :4},{"att_a" : 166, "time" : 5}]]

2 个答案:

答案 0 :(得分:2)

生成一个将输入列表的id映射到相应对象的字典很简单:

from collections import defaultdict

original = [{"id": "chehjkndskns", "att_a" : 12, "time" : 4},{"id": "chehjkndskns", "att_a" : 15, "time" : 5}, {"id": "sjnd", "att_a" : 14, "time" : 4},{"id": "sjnd", "att_a" : 166, "time" : 5}]

result = defaultdict(lambda: [])    
for val in original:
    result[val["id"]] += [val]

print(result)
# {'sjnd': [{'att_a': 14, 'time': 4, 'id': 'sjnd'}, {'att_a': 166, 'time': 5, 'id': 'sjnd'}], 'chehjkndskns': [{'att_a': 12, 'time': 4, 'id': 'chehjkndskns'}, {'att_a': 15, 'time': 5, 'id': 'chehjkndskns'}]}

如果你真的想要你所描述的数组格式的结果,你可以简单地添加一个额外的步骤来改变它:

result = [{"id": key, "attributes": val} for key, val in result.items()]

print(result)
# [{'attributes': [{'time': 4, 'att_a': 12, 'id': 'chehjkndskns'}, {'time': 5, 'att_a': 15, 'id': 'chehjkndskns'}], 'id': 'chehjkndskns'}, {'attributes': [{'time': 4, 'att_a': 14, 'id': 'sjnd'}, {'time': 5, 'att_a': 166, 'id': 'sjnd'}], 'id': 'sjnd'}]

答案 1 :(得分:0)

list1 =[{"id": "chehjkndskns", "att_a" : 12, "time" : 4},
        {"id": "chehjkndskns", "att_a" : 15, "time" : 5},
        {"id": "sjnd", "att_a" : 14, "time" : 4},
        {"id": "sjnd", "att_a" : 166, "time" : 5}]

new_list = map(lambda d: [{'id': d['id'],'attributes': [{'att_a': d['att_a'], 'time':d['time']}]}], list1)