python: 合并多个字典的键?

24 投票
6 回答
25556 浏览
提问于 2025-04-16 13:19

我有5个字典,我想把它们的键合并在一起。

alldict =  [dict1, dict2, dict3, dict4, dict5]

我试过这个

allkey = reduce(lambda x, y: set(x.keys()).union(y.keys()), alldict)

但是出现了错误

AttributeError: 'set' object has no attribute 'keys'

我是不是做错了?我用的是普通的for循环,但我想知道上面的代码为什么不行。

6 个回答

5

对于那些不太起作用的神经元(开个玩笑),这里有个简单的策略:

allkey = []

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

allkey = set(allkey)

我们可以用集合推导式把这段代码简化成更短的形式:

allkey = {key for dictio in alldict for key in dictio}

这个一行代码相比传统的for循环来说,依然很容易理解。将嵌套循环转换为列表或集合推导式的关键是把内层循环(在嵌套循环中变化更快的那个)写在最后一个索引的位置,也就是 for key in dictio

74

我觉得@chuck已经回答了为什么这个方法不管用,但有个更简单的方法就是记住union这个方法可以接受多个参数:

allkey = set().union(*alldict)

这样做就能实现你想要的效果,而且不需要用到循环或者其他复杂的写法。

10

你的解决方案在列表的前两个元素上是有效的,但之后 dict1dict2 被转化成了一个集合,这个集合被放入你的 lambda 表达式中作为 x。所以现在 x 就没有 keys() 这个方法了。

解决办法是从一开始就让 x 成为一个集合,可以通过用一个空集合来初始化这个过程(空集合恰好是并集的中性元素)。

试试用一个初始化器:

allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())

另外一种不使用任何 lambda 的方法是:

allkey = reduce(set.union, map(set, map(dict.keys, alldict)))

撰写回答