5
votes

Comment convertir une liste avec des paires valeur / clé en dictionnaire

Je voudrais parcourir cette liste

['name: test1', 'email: test1@gmail.com', 'role: test', 'description: test', 'name: test2', 'email: test2@gmail.com' , 'role: test2', 'description: test2', 'name: test3', 'email: test3@gmail.com', 'role: test3', 'description: test3']

et renvoie une liste de dictionnaires pour chaque groupe. Par exemple.

[{name: 'test', email:'test@gmail.com ', role:' test ', description:' test '}, {name:' test2 ', email:' test2 @ gmail .com ', rôle:' test2 ', description:' test2 '}]

J'ai essayé de diviser la liste par, (virgule) et de la rechercher pour "nom:". Je peux renvoyer un champ tel que le nom, mais j'ai du mal à créer un lien vers l'e-mail, le rôle, etc.

Merci pour toute aide à l'avance.


2 commentaires

Cette liste d'entrées est-elle garantie d'être dans cet ordre ou les éléments peuvent-ils être dans n'importe quel ordre?


La taille de chaque groupe dans l'entrée est-elle fixe ou non? Sinon, comment déterminez-vous la limite du groupe?


5 Réponses :


2
votes

Je suppose que votre commande est toujours la même, c'est-à-dire par groupes de 4. L'idée est de diviser les chaînes en utilisant : puis de créer une clé / valeur paires et utilisez des boucles for imbriquées. Le .strip () consiste à se débarrasser des espaces

answer = [{j.split(':')[0]:j.split(':')[1].strip() for j in lst[i:i+4]} for i in range(0, len(lst), 4)]

Une compréhension de liste ressemblerait à

lst = ['name: test1', 'email: test1@gmail.com', 'role: test', 'description: test', 
       'name: test2', 'email: test2@gmail.com', 'role: test2', 'description: test2', 
       'name: test3', 'email: test3@gmail.com', 'role: test3', 'description: test3']

answer = []

for i in range(0, len(lst), 4):
    dic = {}
    for j in lst[i:i+4]:
        dic[j.split(':')[0]] = j.split(':')[1].strip() 
    answer.append(dic)

# [{'name': 'test1',  'email': 'test1@gmail.com',  'role': 'test',  'description': 'test'},
    #  {'name': 'test2',  'email': 'test2@gmail.com',  'role': 'test2',  'description': 'test2'},
    #  {'name': 'test3',  'email': 'test3@gmail.com',  'role': 'test3',  'description': 'test3'}]

p >


0 commentaires

2
votes

Vous pouvez faire:

dictionary = dict()
all_dictionaries = []
for index , value  in  [x.split(": ") for x in A] :
     if index in dictionary :
         all_dictionaries .append(dictionary )
         dictionary = dict()
     else :
       dictionary [index] = value
all_dictonaries.append(dictionary)


0 commentaires

4
votes

Sans avoir à connaître à l'avance le nombre de clés de chaque dict, vous pouvez parcourir la liste, diviser chaque chaîne en une clé et une valeur par ':' , en ajoutant un nouveau dict à la liste si la clé est déjà dans le dernier dict, et continuez à ajouter la valeur au dernier dict par la clé:

[{'name': 'test1',
  'email': 'test1@gmail.com',
  'role': 'test',
  'description': 'test'},
 {'name': 'test2',
  'email': 'test2@gmail.com',
  'role': 'test2',
  'description': 'test2'},
 {'name': 'test3',
  'email': 'test3@gmail.com',
  'role': 'test3',
  'description': 'test3'}]

afin que votre liste d'échantillons soit stockée dans lst code>, la sortie deviendrait:

output = []
for key_value in lst:
    key, value = key_value.split(': ', 1)
    if not output or key in output[-1]:
        output.append({})
    output[-1][key] = value


0 commentaires

2
votes

Si la forme des données dans la liste est garantie d'être toujours la même que dans l'exemple de question, alors vous pouvez faire ceci:

[{'description': 'test',
  'email': 'test1@gmail.com',
  'name': 'test1',
  'role': 'test'},
 {'description': 'test2',
  'email': 'test2@gmail.com',
  'name': 'test2',
  'role': 'test2'},
 {'description': 'test3',
  'email': 'test3@gmail.com',
  'name': 'test3',
  'role': 'test3'}]

Résultat:

XXX


0 commentaires

1
votes

Cette solution suppose que la taille de chaque groupe est exactement de 4

l = ['name: test1', 'email: test1@gmail.com', 'role: test', 'description: test', 
     'name: test2', 'email: test2@gmail.com', 'role: test2', 'description: test2',
     'name: test3', 'email: test3@gmail.com', 'role: test3', 'description: test3']

output = [dict(s.split(": ") for s in l[i:i+4]) for i in range(0, len(l), 4)]


0 commentaires