2010-08-16 13 views

Odpowiedz

85

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() } 
+1

@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

+4

Albo nawet: '{k: v dla theDict w theDicts dla k, v w theDict.items()}'! – katrielalex

+0

@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

1
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.

+1

to lista, a nie dykcja: >>> typ ([{ "a": 1}, {'b': 2}]) killown

5
>>> 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()) 
+0

Anuluje, jeśli którykolwiek z dyktowanych na liście ma więcej niż jeden przedmiot. – PaulMcG

+0

* kaszel * (zakładając, że każdy słownik zawiera tylko jedną parę klucz-wartość) * kaszel * – katrielalex

+0

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 –

1
>>> 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.

3

słowników płaskich można to zrobić:

from functools import reduce 
reduce(lambda a, b: dict(a, **b), list_of_dicts) 
0

Można użyć join funkcji z funcy Biblioteka:

from funcy import join 
join(list_of_dicts) 
0

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}