Reputation: 691
I have dictionaries inside list as:
[{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]
I want to store values of key keywords
into a dictionary for same pair of values for keys c1
and c2
by name of key as c1#c2
. So output expected is something like:
cars= {'Cars#Class':
['muv','hatchback','suv','sedan','coupe'],
'Cars#FuelType':
['electric','diesel','cng','petrol']}
So when I will use cars['Cars#Class']
gives me ['muv','hatchback','suv','sedan','coupe']
.
Upvotes: 0
Views: 76
Reputation: 12005
Use itertools.groupby
to group the dicts based on the value of the key 'c2' and extract the value of the key keywords
from the grouped dict
>>> lst = [{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'}, {'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'}, {'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]
>>> cars = {f'Cars#{k}':[d['keywords'] for d in v] for k,v in groupby(lst, lambda d: d['c2'])}
>>> print(cars)
{'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'], 'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']}
>>> print(cars['Cars#Class'])
['muv', 'hatchback', 'suv', 'sedan', 'coupe']
>>>
Upvotes: 0
Reputation: 2047
result = {}
for d in ld:
val_c1 = d['c1']
val_c2 = d['c2']
val_key = d['keywords']
combined_key = val_c1+'#'+val_c2
if combined_key not in result:
result[combined_key] = []
result[combined_key].append(val_key)
else:
result[combined_key].append(val_key)
Upvotes: 0
Reputation: 164623
If you are happy to use a 3rd party library you can use Pandas. The pd.DataFrame
constructor accepts a list of dictionaries directly. Given an input list L
:
import pandas as pd
df = pd.DataFrame(L)
d = df.groupby(df['c1'].str.strip()+'#'+df['c2'])['keywords']\
.apply(list).to_dict()
print(d)
{'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'],
'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']}
Upvotes: 1
Reputation: 164623
You can use collections.defaultdict
with iteration. Given an input list of dictionaries L
:
from collections import defaultdict
d = defaultdict(list)
for i in L:
d[i['c1'].strip()+'#'+i['c2']].append(i['keywords'])
Result:
print(d)
defaultdict(list,
{'Cars#Class': ['muv', 'hatchback', 'suv', 'sedan', 'coupe'],
'Cars#FuelType': ['electric', 'diesel', 'cng', 'petrol']})
Upvotes: 2
Reputation: 1205
You can use itertools.goupby to do this.
import itertools
l = [{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'muv'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'hatchback'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'suv'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'sedan'},
{'c1': 'Cars ', 'c2': 'Class', 'keywords': 'coupe'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'electric'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'diesel'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'cng'},
{'c1': 'Cars ', 'c2': 'FuelType', 'keywords': 'petrol'}]
result = {}
for key, group in itertools.groupby(l, lambda x: "{}#{}".format(x['c1'].strip(), x['c2'].strip())):
result[key] = map(lambda x: x['keywords'], list(group))
print(result)
Upvotes: 0