2017-03-02 3 views
6

eine Liste Gegeben:Konvertieren Liste dict Python

source = [{'A':123},{'B':234},{'C':345}] 

Ich brauche eine dict aus dieser Liste im Format:

newDict = {'A':123,'B':234,'C':345} 

Was der syntaktisch sauberste Weg, dies zu erreichen?

+0

Mögliche Duplikate von [Konvertieren Sie eine Liste in ein Wörterbuch in Python] (http://stackoverflow.com/questions/4576115/convert-a-list-to-a-ictionary-in-python) –

+1

Sicher nicht die meisten "syntaktisch sauber" Weg, aber ein bisschen Spaß: 'reduzieren (lambda d, cur: d.update (cur) oder d, source, {})' – miradulo

+0

Was ist, wenn Sie eine Liste '[{'A': 123} haben, {A: 456}] '? Sollte das Ergebnis '{' A ': 123} 'oder' {' A ': 456} 'lauten? –

Antwort

6

Verwenden Sie ein dict-Verständnis:

>>> l = [{'A':123},{'B':234},{'C':345}] 
>>> d = {k: v for dct in l for k, v in dct.items()} 
>>> d 
{'A': 123, 'B': 234, 'C': 345} 

aber es ist wahrscheinlich Meinung Basis, wenn das der „syntaktisch sauberste Weg“ ist, aber ich mag es.

0

Wenn Sie es häufig verwenden, Sie könnten eine merge Funktion definieren möchten, die Sie dann zu reduce passieren kann:

from functools import reduce # Needed for Python3 
source = [{'A':123},{'B':234},{'C':345}] 

def merge(a,b): 
    d = a.copy() 
    d.update(b) 
    return d 

print(reduce(merge, source)) 
#=> {'A': 123, 'C': 345, 'B': 234} 
1

Hier ist ein weiterer Ansatz, der hier zur Verfügung gestellt, sie wie Python implementiert einen Geschmack geben die funktionale Programmiertechnik reduction, über die reduce() Funktion. In Python 3, reduce() is in the functools package. In Python 2, reduce() is a built-in function. Ich verwende Python 3 in dem folgenden Beispiel:

from functools import reduce # don't import if you are using Python 2 

def updater(dict_orig, dict_add): 
    dict_orig.update(dict_add) 
    return dict_orig 

new_dict = reduce(updater, l, dict()) 

Das erste Argument für reduce() ist die Funktion auf der iterable zu bedienen, die zweite ist die iterable selbst (der Liste l), und die dritte ist die optionale Initialisierer Objekt zu Beginn der list zu reduzieren.

Jeder Schritt der Reduzierung erfordert, dass ein Objekt bearbeitet wird: nämlich das Ergebnis des vorherigen Schritts. Aber dict.update() gibt nichts zurück, so dass wir die updater()-Funktion oben benötigen, die die Aktualisierung durchführt und dann die dict zurückgibt, die aktualisiert wird, wodurch das erforderliche Objekt für den nächsten Schritt bereitgestellt wird. Wäre es nicht für dict.update() keinen Rückgabewert, wäre dies alles ein One-Liner.

Da dict.update() direkt auf dem Original dict arbeitet, müssen wir das optional leer dict() initializer Objekt, um die Reduktion zu beginnen - ohne sie, die ersten dict in Ihrer ursprünglichen l Liste geändert werden würde.

Aus all diesen Gründen mag ich @ MSeiferts dict-Verständnis Ansatz viel besser, aber ich postete dies sowieso nur, um Python-Reduktion für Sie zu veranschaulichen.

Verwandte Themen