按字典列对字典列表进行分组

2024-05-14 23:39:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要你的帮助来解决这项任务:我有一个目录列表,上面有关于产品的下一个数据:

    - id;
    - title;
    - country;
    - seller;

在输出结果中,我希望将所有具有相同id的字典分组,创建一个名为“info”的新键和这个键 必须包含与每种产品相关的产品“国家”和产品“卖方”信息的目录列表

输入数据

data = [
    {"id": 1, "title": "Samsung", "country": "France", "seller": "amazon_fr"},
    {"id": 2, "title": "Apple", "country": "Spain", "seller": "amazon_es"},
    {"id": 2, "title": "Apple", "country": "Italy", "seller": "amazon_it"},
]

输出数据

result = [
    {"id": 1, "title": "Samsung", "info": [{"country": "France", "seller": "amazon_fr"}]},
    {"id": 2, "title": "Apple", "info": [{"country": "Spain", "seller": "amazon_es"}, {"country": "Italy", "seller": "amazon_it"}]},
]

非常感谢你的努力。 P.S.熊猫解决方案也受到赞赏


Tags: 数据info目录idappleamazon列表产品
2条回答

下面是一个简单的python解决方案,它基于data中每个字典的id值创建一个结果字典,并在找到匹配的id值时更新该字典中的值。然后使用字典的值创建输出列表:

data = [
    {"id": 1, "title": "Samsung", "country": "France", "seller": "amazon_fr"},
    {"id": 2, "title": "Apple", "country": "Spain", "seller": "amazon_es"},
    {"id": 2, "title": "Apple", "country": "Italy", "seller": "amazon_it"},
]

result = {}
for d in data:
    id = d['id']
    if id in result:
        result[id]['info'] += [{ "country": d['country'], "seller": d['seller'] }]
    else:
        result[id] = { "id": id, "title": d['title'], "info" : [{ "country": d['country'], "seller": d['seller'] }] };
result = [r for r in result.values()]

print(result)

输出:

[
 {'title': 'Samsung', 'id': 1, 'info': [{'seller': 'amazon_fr', 'country': 'France'}]},
 {'title': 'Apple', 'id': 2, 'info': [{'seller': 'amazon_es', 'country': 'Spain'}, 
                                      {'seller': 'amazon_it', 'country': 'Italy'}
                                     ]
 }
]

您可以使用itertools.groupby:

from operator import itemgetter
from itertools import groupby

data.sort(key=itemgetter('id'))
group = groupby(data, key=lambda x: (x['id'], x['title']))
result = [
    {'id': i, 'title': t, 'info': [{'country': d['country'], 'seller': d['seller']} for d in v]}
    for (i, t), v in group]

输出:

[{'id': 1,
  'title': 'Samsung',
  'info': [{'country': 'France', 'seller': 'amazon_fr'}]},
 {'id': 2,
  'title': 'Apple',
  'info': [{'country': 'Spain', 'seller': 'amazon_es'},
   {'country': 'Italy', 'seller': 'amazon_it'}]}]

相关问题 更多 >

    热门问题