2017-03-02 19 views
6

otrzymali listę:Konwersja listy do dict Pythona

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

muszę dict z tej listy w formacie:

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

Jaki jest składniowo najczystszym sposobem osiągnięcia tego celu?

+0

Możliwy duplikat [Konwertuj listę do słownika w Pythonie] (http://stackoverflow.com/questions/4576115/convert-a-list-to-a-dictionary-in-python) –

+1

Z pewnością nie najbardziej "syntaktycznie czysty" sposób, ale nieco zabawny: 'zmniejszyć (lambda d, cur: d.update (cur) lub d, źródło, {})' – miradulo

+0

Co jeśli masz listę '[{'' ': 123}, {'A:: 456}] '? Czy wynik powinien wynosić '{'A': 123}' lub '{'A': 456}'? –

Odpowiedz

6

Użyj dict-zrozumieniem:

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

Jednak to prawdopodobnie na podstawie opinii, jeśli to jest „składniowo najczystszym sposobem”, ale mi się podoba.

0

Jeśli używamy go często, warto zdefiniować merge funkcji, które można następnie przekazać do reduce:

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

Oto dodatkowe podejście, pod warunkiem, żeby dać wam smak dla how narzędzi Pythona technika programowania funkcjonalnego o nazwie reduction, za pomocą funkcji reduce(). W języku Python 3, reduce() is in the functools package. W języku Python 2, reduce() is a built-in function. Używam Python 3 w poniższym przykładzie:

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()) 

Pierwszym argumentem reduce() jest funkcja działać na iterable, drugi to sam (lista l) iterable, a trzeci jest opcjonalny przedmiot initializer umieścić na początku list, aby zmniejszyć.

Każdy etap redukcji wymaga obsługi obiektu, a mianowicie rezultatu poprzedniego kroku. Ale dict.update() nic nie zwraca, więc potrzebujemy powyższej funkcji updater(), która wykonuje aktualizację, a następnie zwraca zaktualizowaną dict, zapewniając w ten sposób wymagany obiekt do następnego kroku. Gdyby nie była to wartość zwracana, byłaby to jedna liniówka.

Ponieważ dict.update() działa bezpośrednio na oryginalnym dict musimy, że opcja pusty obiekt dict() initializer na rozpoczęcie redukcji - bez niego, pierwszy dict w swojej pierwotnej liście l będzie modyfikowana.

Z tych wszystkich powodów lubię podejście do rozumienia dyktowanego przeze mnie MSeifert znacznie lepiej, ale napisałem to i tak, aby zilustrować redukcję Pythona dla ciebie.