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.
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"})
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'}]
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
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
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]
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
>>> 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
.
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]