Learner
Learner

Reputation: 691

Create a dictionary based on same key pairs from dictionary inside a list

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

Answers (5)

Sunitha
Sunitha

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

Fuji Komalan
Fuji Komalan

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

jpp
jpp

Reputation: 164623

pandas

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

jpp
jpp

Reputation: 164623

defaultdict

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

vishal
vishal

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

Related Questions