gpt4 book ai didi

python - 如果没有 Pandas 的字典,则在列表上实现复杂的分组

转载 作者:行者123 更新时间:2023-11-28 22:09:45 25 4
gpt4 key购买 nike

我有下一个数据:

data = [{'id': 123, 'name': 'John', 'city': 'London', 'count1': 1, 'count2': 4, 'count3': 6},
{'id': 456, 'name': 'Sam', 'city': 'Paris', 'count1': 6, 'count2': 7, 'count3': 2},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 3, 'count2': 9, 'count3': 10},
{'id': 789, 'name': 'Nick', 'city': 'Berlin', 'count1': 0, 'count2': 3, 'count3': 4},
{'id': 456, 'name': 'Sam', 'city': 'Paris', 'count1': 2, 'count2': 8, 'count3': 5},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 7, 'count2': 1, 'count3': 0},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 5, 'count2': 0, 'count3': 3},
{'id': 789, 'name': 'Nick', 'city': 'Berlin', 'count1': 5, 'count2': 5, 'count3': 7}]

如何根据键 idnamecity 和 sum 键 count1 按此字典列表进行分组, count2, count3, 不使用 pandas?我想得到下一个结果:

[{'id': 123, 'name': 'John', 'city': 'London', 'count1': 16, 'count2': 14, 'count3': 19},
{'id': 456, 'name': 'Sam', 'city': 'Paris', 'count1': 8, 'count2': 15, 'count3': 7},
{'id': 789, 'name': 'Nick', 'city': 'Berlin', 'count1': 5, 'count2': 8, 'count3': 11}]

最佳答案

使用 itertools.groupbycollections.Counter 的一种可能的解决方案:

data = [{'id': 123, 'name': 'John', 'city': 'London', 'count1': 1, 'count2': 4, 'count3': 6},
{'id': 456, 'name': 'Sam', 'city': 'Paris', 'count1': 6, 'count2': 7, 'count3': 2},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 3, 'count2': 9, 'count3': 10},
{'id': 789, 'name': 'Nick', 'city': 'Berlin', 'count1': 0, 'count2': 3, 'count3': 4},
{'id': 456, 'name': 'Sam', 'city': 'Paris', 'count1': 2, 'count2': 8, 'count3': 5},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 7, 'count2': 1, 'count3': 0},
{'id': 123, 'name': 'John', 'city': 'London', 'count1': 5, 'count2': 0, 'count3': 3},
{'id': 789, 'name': 'Nick', 'city': 'Berlin', 'count1': 5, 'count2': 5, 'count3': 7}]

from itertools import groupby
from collections import Counter

counters = {}
for v, g in groupby(sorted(data, key=lambda k: (k['id'], k['name'], k['city'])), lambda k: (k['id'], k['name'], k['city'])):
for item in g:
counters.setdefault(v, Counter()).update({'count1': item['count1'], 'count2': item['count2'], 'count3': item['count3']})

out = [{'id':_id, 'name': name, 'city': city,
'count1': counters[(_id, name, city)]['count1'],
'count2': counters[(_id, name, city)]['count2'],
'count3': counters[(_id, name, city)]['count3']} for (_id, name, city) in counters]

from pprint import pprint
pprint(out, width=120)

打印:

[{'city': 'London', 'count1': 16, 'count2': 14, 'count3': 19, 'id': 123, 'name': 'John'},
{'city': 'Paris', 'count1': 8, 'count2': 15, 'count3': 7, 'id': 456, 'name': 'Sam'},
{'city': 'Berlin', 'count1': 5, 'count2': 8, 'count3': 11, 'id': 789, 'name': 'Nick'}]

或没有 groupby(这将是 O(n)):

from collections import Counter

counters = {}
for item in data:
v = (item['id'], item['name'], item['city'])
counters.setdefault(v, Counter()).update({'count1': item['count1'], 'count2': item['count2'], 'count3': item['count3']})

out = [{'id':_id, 'name': name, 'city': city,
'count1': counters[(_id, name, city)]['count1'],
'count2': counters[(_id, name, city)]['count2'],
'count3': counters[(_id, name, city)]['count3']} for (_id, name, city) in counters]

from pprint import pprint
pprint(out, width=120)

关于python - 如果没有 Pandas 的字典,则在列表上实现复杂的分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57332930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com