Convert a string to list of dictionaries

Viewed 307

I have a string as below

 gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

If you see clearly its kind of 2 dictionaries rule:unique,attribute:geo,name:unq1 and rule:sum,attribute:sales,name:sum_sales

I want to convert them to as below

 [
  {'rule': 'sum', 'attribute': 'sales', 'name': 'sum_sales'},
    {'rule': 'unique', 'attribute': 'geo', 'name': 'uniq1'}
 ]

Kindly help

I tried

gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'
 dlist=[]
 at_rule_gm=(x.split(':') for x in gmr.split(','))
 dict(at_rule_gm)

but here I get only the last dictionary.

3 Answers

gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales' split_str = gmr.split(',') dlist = []

for num in range(0, len(split_str),3):

temp_dict = {}
temp1 = split_str[num]
temp2 = split_str[num+1]
temp3 = split_str[num+2]
key,value = temp1.split(':')
temp_dict.update({key:value})
key,value = temp2.split(':')
temp_dict.update({key:value})
key,value = temp3.split(':')
temp_dict.update({key:value})
dlist.append(temp_dict)

Start with sample of OP:

>>> gmr='rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

Make an empty list first.

>>> dlist = [ ]

Loop with entry over list, yielded by gmr.split(','),

Store entry.split(':') into pair,

Check whether first value in pair (the key) is 'rule'

If so, append a new empty dictionary to dlist

Store pair into last entry of dlist:

>>> for entry in gmr.split(','):
    pair = entry.split(':')
    if pair[0] == 'rule':
        dlist.append({ })
    dlist[-1][pair[0]] = pair[1]

Print result:

>>> print(dlist)
[{'name': 'unq1', 'attribute': 'geo', 'rule': 'unique'},
   {'name': 'sum_sales', 'attribute': 'sales', 'rule': 'sum'}]

Looks like what OP intended to get.

dict always gives a single dictionary, not a list of dictionaries. For the latter, you can use a list comprehension after first splitting by 'rule:':

gmr = 'rule:unique,attribute:geo,name:unq1,rule:sum,attribute:sales,name:sum_sales'

items = (f'rule:{x}' for x in filter(None, gmr.split('rule:')))
res = [dict(x.split(':') for x in item.split(',') if x) for item in items]

print(res)

# [{'attribute': 'geo', 'name': 'unq1', 'rule': 'unique'},
#  {'attribute': 'sales', 'name': 'sum_sales', 'rule': 'sum'}]
Related