3
votes

Convertir une chaîne en liste de dictionnaires

J'ai une chaîne comme ci-dessous

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)

Si vous voyez clairement son genre de 2 dictionnaires règle: unique, attribut: geo, nom: unq1 et rule: sum, attribute: sales, name: sum_sales

Je veux les convertir comme ci-dessous

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

Veuillez aider

J'ai essayé

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

mais ici je n'ai que le dernier dictionnaire.


0 commentaires

3 Réponses :


1
votes

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

pour 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)


1 commentaires

Veuillez ajouter du contexte à votre réponse.



0
votes

dict donne toujours un dictionnaire unique, pas une liste de dictionnaires. Pour ce dernier, vous pouvez utiliser une compréhension de liste après le premier découpage par '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'}]


3 commentaires

TypeError Traceback (dernier appel en dernier) dans () 1 items = (f'rule: {x} 'for x in filter (None, gmr.split (' rule: ') ))) ----> 2 res = [dict (x.split (':') for x in item.split (',') if x) for item in items] dans (.0) 1 items = (f'rule: {x} 'for x in filter (None, gmr.split (' rule: '))) ----> 2 res = [dict (x .split (':') for x in item.split (',') if x) for item in items] TypeError: l'objet 'dict' n'est pas appelable


@KumarP, impossible de répliquer, l'exemple que je donne fonctionne bien et est identique à votre entrée.


@KumarP, c'est probablement parce que vous avez défini une variable dict plus tôt. Ne fais pas ça. Utilisez d_ , dict_ , dct ou autre chose.



1
votes

Commencez avec un exemple d'OP:

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

Créez d'abord une liste vide.

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

Boucle avec entrée code > over list, produit par gmr.split(','),

Stocker entry.split (':') dans paire ,

Vérifiez si la première valeur de paire (la clé) est 'rule'

Si oui, ajouter un nouveau dictionnaire vide à dlist

Enregistrer la paire dans la dernière entrée de dlist:

>>> dlist = [ ]

Résultat d'impression:

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

On dirait ce que l'OP a l'intention d'obtenir.


0 commentaires