EDITJak scalić listę dyktów w jeden dyktat?
mam:
[{'a':1},{'b':2},{'c':1},{'d':2}]
wyjście powinno być:
{'a':1,'b':2,'c':1,'d':2}
EDITJak scalić listę dyktów w jeden dyktat?
mam:
[{'a':1},{'b':2},{'c':1},{'d':2}]
wyjście powinno być:
{'a':1,'b':2,'c':1,'d':2}
działa to dla słowników o dowolnej długości:
>>> result = {}
>>> for d in L:
... result.update(d)
...
>>> result
{'a':1,'c':2,'b':1,'d':2}
I jako generator oneliner:
dict(pair for d in L for pair in d.items())
W Pythonie 2.7 i 3.x to może i powinna być zapisana jako dict zrozumieniem (dzięki, @katrielalex):
{ k: v for d in L for k, v in d.items() }
@Paul McGuire: Mam szczerą nadzieję, że odpowiednie użycie pętli for, wyrażeń generatora i wbudowanych nie jest uważane za geniusza (lub w jakikolwiek sposób wyjątkową umiejętność) wśród programistów Pythona. Dzięki i tak :) – delnan
Albo nawet: '{k: v dla theDict w theDicts dla k, v w theDict.items()}'! – katrielalex
@katrielalex: I ** love ** dict ze zrozumieniem! Ale nie zawracam sobie głowy umieszczaniem ich w moich odpowiedziach, ponieważ są to tylko pytony 3, ale dołączę je. – delnan
dict1.update(dict2)
To jest asymetryczny, ponieważ trzeba wybrać, co zrobić z duplikatów kluczy; w takim przypadku dict2
zastąpi dict1
. Wymień je na inny sposób.
EDYCJA: Ach, przepraszam, nie widziałem tego.
Jest możliwe, aby to zrobić w jednym wyrażeniu:
>>> from itertools import chain
>>> dict(chain(*map(dict.items, theDicts)))
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Nie kredytowej do mnie ten ostatni!
Jednakże, uważam, że może to być bardziej Pythoniczne (jawne> niejawne, płaskie> zagnieżdżone), aby to zrobić za pomocą prostej pętli for
. YMMV.
to lista, a nie dykcja: >>> typ ([{ "a": 1}, {'b': 2}])
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Uwaga: kolejność 'b' i 'c' nie pasuje do wyjścia bo dicts są nieuporządkowane
jeśli dicts może mieć więcej niż jeden klucz/wartość
>>> dict(j for i in L for j in i.items())
Anuluje, jeśli którykolwiek z dyktowanych na liście ma więcej niż jeden przedmiot. – PaulMcG
* kaszel * (zakładając, że każdy słownik zawiera tylko jedną parę klucz-wartość) * kaszel * – katrielalex
Ah, na początku napisałem metodę, która działa z ogólnymi dyktami, ale wyglądało na to, że OP nie potrzebuje tego –
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>
Uwaga dodałem parę sekund klucz/wartość do ostatni słownik, aby pokazać, że działa z wieloma wpisami. Również klucze z dyktowanych później na liście zastąpią ten sam klucz z wcześniejszego dyktowania.
słowników płaskich można to zrobić:
from functools import reduce
reduce(lambda a, b: dict(a, **b), list_of_dicts)
dic1 = { 'Maria': 12 'Paco': 22, "Jose": 23} dic2 = {'Patricia': 25, "Marcos": 22 'Tomas': 36}
dic2 = dict (dic1.items() + dic2.przedmiotów())
i to będzie wynik:
dic2 { 'Jose': 23 'Marcos': 22 'Patricia': 25 'Tomas': 36 'Paco': 22, 'Maria': 12}
W przypadku Python 3.3+, istnieje ChainMap
collection:
>>> from collections import ChainMap
>>> a = [{'a':1},{'b':2},{'c':1},{'d':2}]
>>> dict(ChainMap(*a))
{'b': 2, 'c': 1, 'a': 1, 'd': 2}
zobacz także:
zobaczyć http://stackoverflow.com/questions/2365921/merging-python-dictionaries – shox
To prawda, chociaż przechodzi w dict list. – katrielalex
to lista, a nie dyktatura: >>> type ([{'a': 1}, {'b': 2}]) –
killown