繁体   English   中英

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

[英]Group list of dictionaries by dictionary column

我需要你的帮助来解决这个任务:我有一个包含有关产品的下一个数据的字典列表:

    - 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"}]},
]

非常感谢您的努力。 PS Pandas 解决方案也很受欢迎。

这是一个直接的 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'}]}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM