基于关键字总数和分组的Python字典列表集合

基于关键字总数和分组的Python字典列表集合,python,Python,各位, 我的字典如下 d = [{'status': 'Red', 'name': 'Alex'}, {'status': 'Red', 'name': 'Alex'}, {'status': 'Green', 'name': 'Alex'}, {'status': 'Yellow', 'name': 'Peter'}, {'status': 'Green', 'name': 'Mike'}, {'status': 'Yellow', 'name': 'Alex'},

各位, 我的字典如下

d = [{'status': 'Red', 'name': 'Alex'}, {'status': 'Red', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Alex'}, {'status': 'Yellow', 'name': 'Peter'}, 
     {'status': 'Green', 'name': 'Mike'}, {'status': 'Yellow', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Peter'}, {'status': 'Red', 'name': 'Mike'}, 
     {'status': 'Yellow', 'name': 'Alex'}]
d = [{"name": "Alex", "Red": 2, "Green": 1, "Yellow": 2, "Total": 5},
     {"name": "Peter", "Red": 0, "Green": 1, "Yellow": 1, "Total": 2},
     {"name": "Mike", "Red": 1, "Green": 1, "Yellow": 0, "Total": 2}
    ]
我试图以最有效的方式对其进行聚合,我期望的输出应该如下所示

d = [{'status': 'Red', 'name': 'Alex'}, {'status': 'Red', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Alex'}, {'status': 'Yellow', 'name': 'Peter'}, 
     {'status': 'Green', 'name': 'Mike'}, {'status': 'Yellow', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Peter'}, {'status': 'Red', 'name': 'Mike'}, 
     {'status': 'Yellow', 'name': 'Alex'}]
d = [{"name": "Alex", "Red": 2, "Green": 1, "Yellow": 2, "Total": 5},
     {"name": "Peter", "Red": 0, "Green": 1, "Yellow": 1, "Total": 2},
     {"name": "Mike", "Red": 1, "Green": 1, "Yellow": 0, "Total": 2}
    ]
我能够按总计数进行聚合,但无法按“状态”值对其进行分组

from collections import Counter
output = Counter(i['name'] for i in d)

非常感谢您提供的任何帮助。一种方法是创建一个dict并存储值,最后将其转换为所需的格式。在我的例子中,我创建了一个以名称为键的空dict,并更新了值(与直接创建它的效率较低的O(N^2)相比,这是O(N))。 相同的代码:

d = [{'status': 'Red', 'name': 'Alex'}, {'status': 'Red', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Alex'}, {'status': 'Yellow', 'name': 'Peter'}, 
     {'status': 'Green', 'name': 'Mike'}, {'status': 'Yellow', 'name': 'Alex'}, 
     {'status': 'Green', 'name': 'Peter'}, {'status': 'Red', 'name': 'Mike'}, 
     {'status': 'Yellow', 'name': 'Alex'}]

res = {}
for val in d:
    if val["name"] not in res:
        res[val["name"]] = {"Red": 0, "Green": 0, "Yellow": 0}
    res[val["name"]][val["status"]] += 1
data = [{"name": key,
         "Red": res[key]["Red"],
         "Green": res[key]["Green"],
         "Yellow": res[key]["Yellow"]} for key in res.keys()]
你能行

from collections import defaultdict

res = defaultdict(list)
unique = set()
for i in d:
    res[i['name']].append(i['status'])
    unique.add(i['status'])
res_total = [{'name': k, **Counter(v), **{ i: 0 for i in unique - set(v)}} for k, v in res.items()]
print(res_total)
输出

[{'name': 'Alex', 'Red': 2, 'Green': 1, 'Yellow': 2},
 {'name': 'Peter', 'Yellow': 1, 'Green': 1, 'Red': 0},
 {'name': 'Mike', 'Green': 1, 'Red': 1, 'Yellow': 0}]

计数为0的颜色如何?您导入了defaultdict,但正在使用计数器,请清理代码。感谢您的及时帮助,我添加了总计,并进行了以下调整。res_total=[{'name':k,**计数器(v),**{i:0表示唯一集(v)},total:len(v)}表示k,v表示res.items()]