gpt4 book ai didi

python - 对 Python 字典列表进行分组

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:24 24 4
gpt4 key购买 nike

我有一些来自 API 的 JSON 数据作为字典列表,例如:

entities = [
{'name': 'McDonalds', 'city': 'New York', 'gross': 250000000, 'id': '000001'},
{'name': 'McDonalds', 'city': 'Philadelphia', 'gross': 190000000, 'id': '000002'},
{'name': 'Shake Shack', 'city': 'Los Angeles', 'gross': 17000000, 'id': '000003'},
{'name': 'In-N-Out Burger', 'city': 'Houston', 'gross': 23000000, 'id': '000004'},
{'name': 'In-N-Out Burger', 'city': 'Atlanta', 'gross': 12000000, 'id': '000005'},
{'name': 'In-N-Out Burger', 'city': 'Dallas', 'gross': 950000, 'id': '000006'},
]

我正在尝试将所有具有相同名称的条目分组到另一个以其业务命名的词典列表中。

def group_entities(entities):

entity_groups = []

# Establish a blank list for each unique name
for entity in entities:
entity['name'] = []
entity_groups.append(entity['name'])

# Within each business's list, add separate dictionaries with details
for entity in entities:
entity['name'].append({
'name':entity['name'],
'city':entity['city'],
'gross':entity['gross'],
'id':entity['id']
})

entity_groups.extend(entity['name'])

return entity_groups

我不能使用 entity['name'] 作为变量名,因为它只会更改原始值,我也不能使用该名称的字符串版本。我想以我可以迭代和显示的数据结束,如:

Business
• All City 1 Dictionary Values
• All City 2 Dictionary Values, etc
Business
• All City 1 Dictionary Values
• All City 2 Dictionary Values, etc

我什至不知道如何对此进行进一步研究,因为我不知道合适的“googleable”术语来描述我正在尝试做的事情。

最佳答案

如果您的数据按名称排序:

from itertools import groupby
from operator import itemgetter

entities = [
{'name': 'McDonalds', 'city': 'New York', 'gross': 250000000, 'id': '000001'},
{'name': 'McDonalds', 'city': 'Philadelphia', 'gross': 190000000, 'id': '000002'},
{'name': 'Shake Shack', 'city': 'Los Angeles', 'gross': 17000000, 'id': '000003'},
{'name': 'In-N-Out Burger', 'city': 'Houston', 'gross': 23000000, 'id': '000004'},
{'name': 'In-N-Out Burger', 'city': 'Atlanta', 'gross': 12000000, 'id': '000005'},
{'name': 'In-N-Out Burger', 'city': 'Dallas', 'gross': 950000, 'id': '000006'},
]
data = [{k: list(v)} for k, v in groupby(entities, itemgetter("name"))]

这会给你:

[{'McDonalds': [{'id': '000001', 'city': 'New York', 'name': 'McDonalds', 'gross': 250000000}, {'id': '000002', 'city': 'Philadelphia', 'name': 'McDonalds', 'gross': 190000000}]}, {'Shake Shack': [{'id': '000003', 'city': 'Los Angeles', 'name': 'Shake Shack', 'gross': 17000000}]}, {'In-N-Out Burger': [{'id': '000004', 'city': 'Houston', 'name': 'In-N-Out Burger', 'gross': 23000000}, {'id': '000005', 'city': 'Atlanta', 'name': 'In-N-Out Burger', 'gross': 12000000}, {'id': '000006', 'city': 'Dallas', 'name': 'In-N-Out Burger', 'gross': 950000}]}]

或者如果你不想要这个名字:

 keys = ("id","gross", "city")

data = [{k: [dict(zip(keys, itemgetter(*keys)(dct))) for dct in v]} for k, v in groupby(entities, itemgetter("name"))]

如果数据未排序,您可以使用defaultdict:

from collections import defaultdict

d = defaultdict(list)

for entity in entities:
d[entity["name"]].append(dict(entity))
print([{k: v} for k,v in d.items()])

再次删除名称,或者您可能想使用原始字典并且不介意改变它们:

from collections import defaultdict

d = defaultdict(list)

for entity in entities:
d[entity.pop("name")].append(entity)
print([{k: v} for k,v in d.items()])

这会给你:

[{'Shake Shack': [{'id': '000003', 'city': 'Los Angeles', 'gross': 17000000}]}, {'McDonalds': [{'id': '000001', 'city': 'New York', 'gross': 250000000}, {'id': '000002', 'city': 'Philadelphia', 'gross': 190000000}]}, {'In-N-Out Burger': [{'id': '000004', 'city': 'Houston', 'gross': 23000000}, {'id': '000005', 'city': 'Atlanta', 'gross': 12000000}, {'id': '000006', 'city': 'Dallas', 'gross': 950000}]}]

这完全取决于您是否要再次使用原始字典和/或是否要将名称保留在字典中。您可以组合部分逻辑以获得您喜欢的任何格式。

关于python - 对 Python 字典列表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37667632/

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