2017-03-02 164 views
6

給出一個列表:轉換列表字典蟒蛇

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

我需要從該列表的字典格式:

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

什麼是完成這一任務的語法乾淨的方式?

+0

可能的重複[將列表轉換爲Python中的字典](http://stackoverflow.com/questions/4576115/convert-a-list-to-a-dictionary-in-python) –

+1

當然不是最「語法上乾淨」的方式,但有點樂趣:'reduce(lambda d,cur:d.update(cur)or d,source,{})' – miradulo

+0

如果你有一個列表'[{'A':123}, {'A':456}]'?如果結果是'{'A':123}'或'{'A':456}'? –

回答

6

使用的字典 - 理解:

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

但是它可能意見爲基礎,如果是這樣的「語法乾淨的方式」,但我喜歡它。

0

如果你經常使用它,你可能希望定義一個merge功能,然後你就可以傳遞給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

這裏有一個額外的方法,在這裏提供給你的Python如何實現一個味道該功能編程技術通過reduce()功能被稱爲reduction。在Python 3中,reduce() is in the functools package。在Python 2中,reduce() is a built-in function。我使用Python 3在下面的例子:

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

的第一個參數reduce()是在迭代操作的功能,第二個是可迭代本身(列表l),第三個是可選的初始化對象放在list的開頭減少。

減少的每一步都需要一個對象進行操作:即上一步的結果。但dict.update()不會返回任何內容,因此我們需要上面的updater()函數,它執行更新,然後返回正在更新的dict,從而爲下一步提供所需的對象。如果dict.update()沒有返回值,那麼這將全部是單線。

因爲dict.update()直接作用於原dict,我們需要一個可選的空dict()初始化對象開出減少 - 在原始l名單沒有它,首先dict將被修改。

由於所有這些原因,我喜歡@ MSeifert的dict-comprehension方法好得多,但無論如何我只是爲了說明Python的縮減而發佈了這個方法。