Home > Net >  List of Dictionary - How to combine a list of dictionary Python
List of Dictionary - How to combine a list of dictionary Python

Time:03-19

a =[{
    "id":"1",
    "Name":'BK',
    "Age":'56'
},
{
    "id":"1",
    "Sex":'Male'
},
{
    "id":"2",
    "Name":"AK",
    "Age":"32"
}]

I have a list of dictionary with a person information split in multiple dictionary as above for ex above id 1's information is contained in first 2 dictionary , how can i get an output of below

{1: {'Name':'BK','Age':'56','Sex':'Male'}, 2: { 'Name': 'AK','Age':'32'}}

CodePudding user response:

You can use some built in functions. groupby to group the dictionaries by id, then a defaultdict to collect the results.

from itertools import groupby
from collections import defaultdict

a =[{ "id":"1", "Name":'BK', "Age":'56' }, { "id":"1", "Sex":'Male' }, { "id":"2", "Name":"AK", "Age":"32" }]

results = defaultdict(dict)
key = lambda d: d['id']
for group_id, grouped in groupby(sorted(a, key=key), key=key):
    for d in grouped:
        d.pop('id')
        results[group_id].update(**d)

This gives you:

>>> results
defaultdict(<type 'dict'>, {'1': {'Age': '56', 'Name': 'BK', 'Sex': 'Male'}, '2': {'Age': '32', 'Name': 'AK'}})

The defaultdict type behaves like a normal dict, except that when you reference an unknown value, a default value is returned. This means that as the dicts in a are iterated over, the values (except for id) are updated onto either an existing dict, or an automatic newly created one.

How does collections.defaultdict work?

CodePudding user response:

Using defaultdict

from collections import defaultdict

a = [{
    "id": "1",
    "Name": 'BK',
    "Age": '56'
},
    {
        "id": "1",
        "Sex": 'Male'
    },
    {
        "id": "2",
        "Name": "AK",
        "Age": "32"
    }
]

final_ = defaultdict(dict)
for row in a:
    final_[row.pop('id')].update(row)

print(final_)

defaultdict(<class 'dict'>, {'1': {'Name': 'BK', 'Age': '56', 'Sex': 'Male'}, '2': {'Name': 'AK', 'Age': '32'}})

CodePudding user response:

You can combine 2 dictionaries by using the .update() function

dict_a = { "id":"1", "Name":'BK', "Age":'56' }
dict_b = { "id":"1", "Sex":'Male' }
dict_a.update(dict_b) # {'Age': '56', 'Name': 'BK', 'Sex': 'Male', 'id': '1'}

Since the output the you want is in dictionary form

combined_dict = {}

for item in a:
  id = item.pop("id")  # pop() remove the id key from item and return the value
  
  if id in combined_dict:
    combined_dict[id].update(item)
  else:
    combined_dict[id] = item

print(combined_dict)  # {'1': {'Name': 'BK', 'Age': '56', 'Sex': 'Male'}, '2': {'Name': 'AK', 'Age': '32'}}

CodePudding user response:

from collections import defaultdict
result = defaultdict(dict)
    
a =[{ "id":"1", "Name":'BK', "Age":'56' }, { "id":"1", "Sex":'Male' }, { "id":"2", "Name":"AK", "Age":"32" }]

for b in a:
  result[b['id']].update(b)

print(result)

CodePudding user response:

d = {}
for p in a:
    id = p["id"]
    if id not in d.keys():
        d[id] = p
    else:
        d[id] = {**d[id], **p}
  • Related