给出一个清单:
source = [{'A':123},{'B':234},{'C':345}]
我需要这个列表中的dict格式为:
newDict = {'A':123,'B':234,'C':345}
完成此任务的语法最干净的方法是什么?
答案 0 :(得分: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}
然而,如果这是语法上最干净的方式,那么它可能是基于意见的。"但我喜欢它。
答案 1 :(得分:1)
这里提供了另一种方法,通过reduce()
函数为您提供Python如何实现名为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()
的第一个参数是对iterable进行操作的函数,第二个参数是iterable本身(你的列表l
),第三个参数是可选的初始化对象。 list
减少。
缩小的每个步骤都需要对象进行操作:即前一步骤的结果。但是dict.update()
没有返回任何内容,因此我们需要上面的updater()
函数,它执行更新,然后返回正在更新的dict
,从而为下一步提供所需的对象。如果不是dict.update()
没有返回值,这将是一个单行。
由于dict.update()
直接在原始dict
上运行,我们需要可选的空dict()
初始值设定项对象来开始缩减 - 没有它,您的第一个dict
原始l
列表将被修改。
出于所有这些原因,我更喜欢@ MSeifert的dict-comprehension方法,但我发布这个只是为了说明你的Python减少。
答案 2 :(得分: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}