将列表转换为字典 Python

7

给定一个列表:

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

我需要一个字典,格式为此列表中的内容:
newDict  = {'A':123,'B':234,'C':345}

最简洁的语法方式是什么?

可能是将Python中的列表转换为字典的重复问题。 - Ben Hare
1
这绝对不是最“语法清晰”的方式,但有点有趣:reduce(lambda d, cur: d.update(cur) or d, source, {}) - miradulo
如果你有一个列表 [{'A': 123}, {'A': 456}],那么结果应该是 {'A': 456} 还是 {'A': 123} - tobias_k
如果源代码为 [{'A':123},{'B':234},{'C':345},{'A':123}],那么我们会遇到问题。形成重复键的字典是不可能的。在这种情况下无法分析完整数据。 - NTP
我会将问题重命名为“将字典条目列表合并为一个字典”。 - matanster
3个回答

11

使用字典推导式:

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

这里提供了一种额外的方法,旨在让您了解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

出于这些原因,我更喜欢@MSeifert的字典推导式方法,但我还是发布了这个例子,只是为了向您说明Python缩减的方法。

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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接