从键值创建元组

Create tuple from key-value

我有一个列表,里面有字典,有以下键:idexternal_id_clientproduct_id,如下所示:

[{'id': 3, 'external_id_client': '7298', 'product_id': 13}, 
{'id': 3, 'external_id_client': '7298', 'product_id': 8}, 
{'id': 4, 'external_id_client': '3', 'product_id': 12}, 
{'id': 4, 'external_id_client': '3', 'product_id': 9}, 
{'id': 5, 'external_id_client': '4', 'product_id': 12}]

我需要如果 IDexternal_id 重复并且我在 product_id 键中有信息,它会在 product_id.[=19 中创建一个元组=]

预期输出:

[{'id': 3, 'external_id_client': '7298', 'product_id': (13, 8)}, 
{'id': 4, 'external_id_client': '3', 'product_id': (12, 9)}, 
{'id': 5, 'external_id_client': '4', 'product_id': (12)}]

我该怎么做?

您可以为此使用 itertools.groupby

from itertools import groupby

lst = [
    {'id': 3, 'external_id_client': '7298', 'product_id': 13}, 
    {'id': 3, 'external_id_client': '7298', 'product_id': 8}, 
    {'id': 4, 'external_id_client': '3', 'product_id': 12}, 
    {'id': 4, 'external_id_client': '3', 'product_id': 9}, 
    {'id': 5, 'external_id_client': '4', 'product_id': 12}
]

result = [
    {
        "id": itemid, 
        "external_id_client": client,
        "product_id": tuple(item["product_id"] for item in group)
    }
    for (itemid, client), group 
        in groupby(lst, key = lambda item: (item["id"], item["external_id_client"]))
]