Creating A Unique List Of Dictionaries From A List Of Dictionaries Which Contains Same Keys But Different Values
suppose i have been given a list of dictionaries like this : [{'id':1, 'symbol':'A', 'num':4}, {'id':2, 'symbol':'A', 'num':3}, {'id':1, 'symbol':'A', 'num':5}, {'id':2, 'symbol':'
Solution 1:
Here's a solution with plain python.
dlst = [{"id":1, "symbol":'A', "num":4}, {"id":2, "symbol":'A', "num":3},
{"id":1, "symbol":'A', "num":5}, {"id":2, "symbol":'B', "num":1}]
# Create a dict where keys are tuples of (id,symbol), values are num
combined_d = {}
for d in dlst:
id_sym = (d["id"], d["symbol"])
if id_sym in combined_d:
combined_d[id_sym] += d["num"]
else:
combined_d[id_sym] = d["num"]
# create a list of dictionaries from the tuple-keyed dict
result = []
for k, v in combined_d.items():
d = {"id": k[0], "symbol": k[1], "num": v}
result.append(d)
print(result)
It does what you want, but the resulting list is not sorted, as it's built from a dictionary.
Solution 2:
I would go the pandas.DataFrame
way -
import pandas as pd
a = [{"id":1, "symbol":'A', "num":4}, {"id":2, "symbol":'A', "num":3}, {"id":1, "symbol":'A', "num":5}, {"id":2, "symbol":'B', "num":1}]
b = pd.DataFrame(a)
c = b.groupby(['id', 'symbol'])['num'].sum().reset_index()
print(c)
d = list(c.to_dict(orient='index').values())
print(d)
Output
[{'id': 1, 'symbol': 'A', 'num': 9}, {'id': 2, 'symbol': 'A', 'num': 3}, {'id': 2, 'symbol': 'B', 'num': 1}]
Hope that works!
Solution 3:
You can use groupby
in the following manner:
from itertools import groupby
from operator import itemgetter
grouper = itemgetter("id", "symbol")
result = []
for key, grp in groupby(sorted(input_data, key = grouper), grouper):
temp_dict = dict(zip(["id", "symbol"], key))
temp_dict["num"] = sum(item["num"] for item in grp)
result.append(temp_dict)
from pprint import pprint
pprint(result)
Output:
[{'id': 1, 'num': 9, 'symbol': 'A'},
{'id': 2, 'num': 3, 'symbol': 'A'},
{'id': 2, 'num': 1, 'symbol': 'B'}]
Post a Comment for "Creating A Unique List Of Dictionaries From A List Of Dictionaries Which Contains Same Keys But Different Values"