[英]Converting list to dict python
給出一個清單:
source = [{'A':123},{'B':234},{'C':345}]
我需要這個列表中的dict格式:
newDict = {'A':123,'B':234,'C':345}
什么是語法上最干凈的方法來實現這一目標?
使用字典理解:
>>> 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}
然而,如果這是“語法上最干凈的方式”,它可能是基於意見的,但我喜歡它。
這里有一個額外的方法,在這里提供給你的Python如何實現所謂的函數式編程技術中的香味降低 ,通過reduce()
函數。 在Python 3中, reduce()
位於functools包中 。 在Python 2中, reduce()
是一個內置函數 。 我在下面的例子中使用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()
的第一個參數是對iterable進行操作的函數,第二個參數是iterable本身(你的列表l
),第三個是可選的初始化對象放在list
的開頭以減少。
減少的每個步驟都需要對象進行操作:即前一步驟的結果。 但是dict.update()
不會返回任何內容,因此我們需要上面的updater()
函數,它執行更新然后返回正在更新的dict
,從而為下一步提供所需的對象。 如果沒有dict.update()
沒有返回值,這將是一個單行。
因為dict.update()
直接在原始dict
,所以我們需要可選的空dict()
初始化器對象來開始減少 - 沒有它,原始l
列表中的第一個dict
將被修改。
出於所有這些原因,我更喜歡@ MSeifert的dict-comprehension方法,但無論如何我發布這個只是為了說明Python減少。
如果經常使用它,您可能需要定義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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.