2012-12-28 7 views
12

Mam listę słowników i chcę dodać klucz dla każdego elementu tej listy. Próbowałem:Dodaj element do każdego słownika listy (zrozumienie listy)

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

ale metoda aktualizacji zwróci None, więc moja lista rezultatem jest pełna Żaden.

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

zwraca błąd składniowy.

Odpowiedz

12

Nie trzeba się martwić o budowie nowej listy słowników, ponieważ odniesienia do swoich aktualnych słowników są takie same jak odniesień do starych słowników:

for item in mylist: 
    item.update({"elem":"value"}) 
+0

Prawo, chciałem użyć wyrażeń listowych, ale jest prostszy bez niego . Dzięki. –

+0

Powinno to również działać ze zrozumieniem listy. na przykład [item.update .... for item in myList] – Erich

2
>>> 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}] 

Jesteś niewłaściwie używając wyrażeń listowych, wezwanie do item.update zwraca wartość None a tym samym swoją nowo utworzona lista będzie pełna None wartości zamiast planowanej dict wartości.

Wystarczy pętli nad elementami na liście i odpowiednio zaktualizować, ponieważ lista zawiera odniesienia do wartości dict.

0

albo nie korzystają z listy zrozumienie, lub zwrócić nowy dict opartą na oryginalnej dict plus nowy klucz:

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

Jeśli chcesz korzystać z listy ze zrozumieniem, jest tam świetna odpowiedź tutaj: https://stackoverflow.com/a/3197365/4403872

W twoim przypadku, to byłoby tak:

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

Np .:

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

Następnie użyj albo

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

lub

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

Wreszcie

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

To jest lepsza odpowiedź niż zaakceptowana –

0

Można użyć mapy.

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

Jeśli masz już listę lements można zrobić:

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

wtedy masz wyniki