python:来自多个字典的联合键?

Tg.*_*Tg. 12 python reduce lambda dictionary

我有5个词典,我想要一个他们的键的联合.

alldict =  [dict1, dict2, dict3, dict4, dict5]
Run Code Online (Sandbox Code Playgroud)

我试过了

allkey = reduce(lambda x, y: set(x.keys()).union(y.keys()), alldict)
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误

AttributeError: 'set' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)

我做错了吗?我使用普通的forloop但我想知道为什么上面的代码不起作用.

Dun*_*can 42

我认为@chuck已经回答了为什么它不起作用的问题,但更简单的方法是记住该union方法可以采用多个参数:

allkey = set().union(*alldict)
Run Code Online (Sandbox Code Playgroud)

做你想要的没有任何循环或lambdas.


chu*_*uck 10

你的解决方案适用于列表中的前两个元素,但随后dict1dict2被缩减为一个集合,并将该集合放入lambda中x.所以现在x不再有这个方法keys()了.

解决方案是从一开始就通过使用空集(这恰好是并集的中性元素)初始化减少来使x成为集合.

尝试使用初始化程序:

allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())
Run Code Online (Sandbox Code Playgroud)

没有任何lambdas的替代方案是:

allkey = reduce(set.union, map(set, map(dict.keys, alldict)))
Run Code Online (Sandbox Code Playgroud)


joa*_*uin 5

非功能性神经元的简单策略(双关语):

allkey = []

for dictio in alldict:
    for key in dictio:
        allkey.append(key)

allkey = set(allkey)
Run Code Online (Sandbox Code Playgroud)

我们可以使用集合推导将这段代码转换为更排序的形式:

allkey = {key for dictio in alldict for key in dictio}
Run Code Online (Sandbox Code Playgroud)

与传统的 for 循环相比,这种单行代码仍然具有很强的可读性。将嵌套循环转换为列表或集合推导式的关键是将内部循环(在嵌套循环中变化更快的那个)写成最后一个索引(即 for key in dictio)。