解压Python中的字典列表

rug*_*tal 4 python merge dictionary python-3.x

根据此答案,在Python 3.5或更高版本中,可以合并两个字典xy解压缩它们:

z = {**x, **y}
Run Code Online (Sandbox Code Playgroud)

是否可以解压缩各种字典表?就像是

def merge(*dicts):
    return {***dicts} # this fails, of course. What should I use here?
Run Code Online (Sandbox Code Playgroud)

例如,我希望

list_of_dicts = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]
{***list_of_dicts} == {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)

请注意,此问题不是关于如何合并字典列表的问题,因为上面的链接提供了对此的答案。这里的问题是:是否有可能以及如何解压缩字典列表?

编辑

正如评论指出,这个问题是非常相似的这一个。但是,解压缩字典列表与简单地合并它们是不同的。假设有一个运算符***旨在解开字典列表,并给出

def print_values(a, b, c, d):
    print('a =', a)
    print('b =', b)
    print('c =', c)
    print('d =', d)

list_of_dicts = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]
Run Code Online (Sandbox Code Playgroud)

有可能写

print_values(***list_of_dicts)
Run Code Online (Sandbox Code Playgroud)

代替

print_values(**merge(list_of_dicts))
Run Code Online (Sandbox Code Playgroud)

And*_* L. 6

另一种解决方案是使用 collections.ChainMap

from collections import ChainMap

dict(ChainMap(*list_of_dicts[::-1]))

Out[88]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)

  • 来这里是为了看看为什么我的回答没有被接受;这好多了。我想我以前从未注意到过“ChainMap”。 (2认同)

che*_*ner 5

它没有语法,但是您可以用来itertools.chain将每个字典的键/值元组连接成一个dict可以使用的流。

from itertools import chain


def merge(*dicts):
    return dict(chain.from_iterable(d.items() for d in dicts))
Run Code Online (Sandbox Code Playgroud)

您还可以使用解压缩由列表推导创建的列表:

def merge(*dicts):
    return dict(*[d.items() for d in dicts])
Run Code Online (Sandbox Code Playgroud)


Jan*_*Jan 5

您可以遍历列表并使用update

lst = [{'a': 1, 'b': 2}, {'c': 3}, {'d': 4}]

dct = {}
for item in lst:
    dct.update(item)

print(dct)
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Run Code Online (Sandbox Code Playgroud)