web-dev-qa-db-fra.com

Ajouter un élément dans chaque dictionnaire d'une liste (compréhension de la liste)

J'ai une liste de dictionnaires et je veux ajouter une clé pour chaque élément de cette liste. J'ai essayé:

result = [ item.update({"elem":"value"}) for item in mylist ]

mais la méthode de mise à jour renvoie None, donc ma liste de résultats est pleine de None.

result = [ item["elem"]="value" for item in mylist ]

renvoie une erreur de syntaxe.

26
MickaëlG

Vous n'avez pas à vous soucier de construire une nouvelle liste de dictionnaires, car les références à vos dictionnaires mis à jour sont les mêmes que les références à vos anciens dictionnaires:

 for item in mylist:
    item.update( {"elem":"value"})
26
Jeffrey Theobald

Si vous souhaitez utiliser la compréhension de liste, il y a une excellente réponse ici: https://stackoverflow.com/a/3197365/4403872

Dans votre cas, ce serait comme ceci:

result = [dict(item, **{'elem':'value'}) for item in myList]

Par exemple :

myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]

Utilisez ensuite

result = [dict(item, **{'elem':'value'}) for item in myList]

ou

result = [dict(item, elem='value') for item in myList]

Finalement,

>>> result
[{'a': 'A', 'elem': 'value'},
 {'b': 'B', 'elem': 'value'},
 {'c': 'C', 'cc': 'CC', 'elem': 'value'}]
32
vk1011

Vous pouvez utiliser la carte.

result = map(lambda item: dict(item, elem='value'), myList)

Si vous avez déjà la liste des éléments, vous pouvez le faire:

#elements = ['value'] * len(myList)
result = map(lambda item: dict(item[0], elem=item[1]),Zip(myList,elements))

alors vous avez les résultats

6
Asive Dlaba

La réponse de @ vk1011 est bonne et peut être étendue avec l'opérateur de diffusion de manière concise et de nouveaux objets de dictionnaire sont un avantage supplémentaire

  1. Pour remplacer la valeur d'une clé existante par la nouvelle, vous pouvez placer l'opérateur de propagation avant le nouvel élément

    result = [{**item, 'elem':'value'} for item in myList]
    
  2. Pour remplacer la valeur de la nouvelle entrée par une valeur existante, utilisez l'opérateur d'étalement après le nouvel élément

    result = [{'elem':'value', **item} for item in myList]
    

Les deux méthodes donneront une liste d'objets de dictionnaire, y compris le nouvel élément

3
matharumanpreet00
>>> a = [ { 1:1 }, {2:2}, {3:3} ]
>>> for item in a:
...     item.update( { "test": "test" } )
... 
>>> a
[{'test': 'test', 1: 1}, {'test': 'test', 2: 2}, {'test': 'test', 3: 3}]

Vous utilisez une compréhension de liste de manière incorrecte, l'appel à item.update renvoie une valeur None et ainsi votre liste nouvellement créée sera pleine de valeurs None au lieu de vos valeurs dict attendues.

Il vous suffit de parcourir les éléments de la liste et de les mettre à jour en conséquence, car la liste contient des références aux valeurs dict.

2
sean

Soit n'utilisez pas de compréhension de liste, soit renvoyez un dict nouvea basé sur le dict original plus la nouvelle clé:

[dict(list(item.items()) + [("elem", "value")]) for item in mylist]
0
Martijn Pieters