给定一个列表:
source = [{'A':123},{'B':234},{'C':345}]
我需要一个字典,格式为此列表中的内容:
newDict = {'A':123,'B':234,'C':345}
最简洁的语法方式是什么?
给定一个列表:
source = [{'A':123},{'B':234},{'C':345}]
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()
函数实现函数式编程技术中的reduction。在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()
的第一个参数是要在可迭代对象上操作的函数,第二个参数是可迭代对象本身(您的列表l
),第三个参数是可选的初始化对象,放置在要减少的list
的开头。
每一步的缩减都需要对一个对象进行操作:即上一步的结果。但是dict.update()
不返回任何内容,因此我们需要上面的updater()
函数,该函数执行更新,然后返回正在更新的dict
,从而提供下一步所需的对象。如果没有dict.update()
没有返回值,这将成为一个一行代码。
由于dict.update()
直接作用于原始的dict
,因此我们需要那个可选的空dict()
初始化对象来开始缩减-如果没有它,则会修改原始l
列表中的第一个dict
。
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}
reduce(lambda d, cur: d.update(cur) or d, source, {})
- miradulo[{'A': 123}, {'A': 456}]
,那么结果应该是{'A': 456}
还是{'A': 123}
? - tobias_k