Home > database >  Create tuple from key-value
Create tuple from key-value

Time:05-13

I have a list with dictionary inside, with the following keys: id, external_id_client, product_id, as below:

[{'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}]

I need that if the ID and external_id are repeated and I have information in the product_id key it creates a tuple in the product_id.

Expected output:

[{'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)}]

How can I do this?

CodePudding user response:

You can use itertools.groupby for this:

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"]))
]
  • Related