Stimmt, obwohl das zu einem Diktat von Listen verschmilzt.
Katriel
1
Es ist eine Liste und kein Diktat: >>> Typ ([{'a': 1}, {'b': 2}]) <Typ 'Liste'>
Killown
Es sollte wirklich einen Einzeiler dafür geben, wenn man bedenkt, wie oft er auftaucht. Gibt es einen Grund, warum {** d für d in d_list} nicht unterstützt wird?
Markemus
Antworten:
162
Dies funktioniert für Wörterbücher beliebiger Länge:
>>> result ={}>>>for d in L:... result.update(d)...>>> result
{'a':1,'c':1,'b':2,'d':2}
Dies ist asymmetrisch, da Sie auswählen müssen, was mit doppelten Schlüsseln geschehen soll. In diesem Fall dict2wird überschrieben dict1. Tauschen Sie sie gegen den anderen Weg aus.
EDIT: Ah, sorry, habe das nicht gesehen.
Es ist möglich, dies in einem einzigen Ausdruck zu tun:
Ich würde jedoch argumentieren, dass es möglicherweise pythonischer (explizit> implizit, flach> verschachtelt) ist, dies mit einer einfachen forSchleife zu tun . YMMV.
Kleine Verbesserung für @dietbuddha Antwort mit Wörterbuch aus PEP 448 entpacken, für mich ist es auf diese Weise besser lesbar, es ist auch schneller :
from functools import reduce
result_dict = reduce(lambda a, b:{**a,**b}, list_of_dicts)
Beachten Sie jedoch, dass dies nur mit Python 3.5+ -Versionen funktioniert.
>>> 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}>>>
Hinweis Ich habe dem letzten Wörterbuch ein zweites Schlüssel / Wert-Paar hinzugefügt, um zu zeigen, dass es mit mehreren Einträgen funktioniert. Auch Schlüssel aus Diktaten später in der Liste überschreiben denselben Schlüssel aus einem früheren Diktat.
Antworten:
Dies funktioniert für Wörterbücher beliebiger Länge:
Zum Verständnis :
quelle
Im Fall von Python 3.3+ gibt es eine
ChainMap
Sammlung :Siehe auch:
quelle
Hinweis: Die Reihenfolge von 'b' und 'c' stimmt nicht mit Ihrer Ausgabe überein, da Diktate ungeordnet sind
wenn die Diktate mehr als einen Schlüssel / Wert haben können
quelle
Für flache Wörterbücher können Sie dies tun:
quelle
Dies ähnelt @delnan, bietet jedoch die Möglichkeit, die k / v-Elemente (Schlüssel / Wert) zu ändern, und ich glaube, dass dies besser lesbar ist:
Ersetzen Sie beispielsweise k / v Elemente wie folgt:
entpackt das k, v-Tupel aus dem Wörterbuchgenerator .items (), nachdem das dict-Objekt aus der Liste gezogen wurde
quelle
Dies ist asymmetrisch, da Sie auswählen müssen, was mit doppelten Schlüsseln geschehen soll. In diesem Fall
dict2
wird überschriebendict1
. Tauschen Sie sie gegen den anderen Weg aus.EDIT: Ah, sorry, habe das nicht gesehen.
Es ist möglich, dies in einem einzigen Ausdruck zu tun:
Keine Gutschrift für diesen letzten!
Ich würde jedoch argumentieren, dass es möglicherweise pythonischer (explizit> implizit, flach> verschachtelt) ist, dies mit einer einfachen
for
Schleife zu tun . YMMV.quelle
Sie können die Join- Funktion aus der Funcy- Bibliothek verwenden:
quelle
Kleine Verbesserung für @dietbuddha Antwort mit Wörterbuch aus PEP 448 entpacken, für mich ist es auf diese Weise besser lesbar, es ist auch schneller :
Beachten Sie jedoch, dass dies nur mit Python 3.5+ -Versionen funktioniert.
quelle
Hinweis Ich habe dem letzten Wörterbuch ein zweites Schlüssel / Wert-Paar hinzugefügt, um zu zeigen, dass es mit mehreren Einträgen funktioniert. Auch Schlüssel aus Diktaten später in der Liste überschreiben denselben Schlüssel aus einem früheren Diktat.
quelle
dic1 = {'Maria': 12, 'Paco': 22, 'Jose': 23} dic2 = {'Patricia': 25, 'Marcos': 22 'Tomas': 36}
dic2 = dict (dic1.items () + dic2.items ())
und das wird das Ergebnis sein:
dic2 {'Jose': 23, 'Marcos': 22, 'Patricia': 25, 'Tomas': 36, 'Paco': 22, 'Maria': 12}
quelle