python: 合并多个字典的键?
我有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
你的解决方案在列表的前两个元素上是有效的,但之后 dict1
和 dict2
被转化成了一个集合,这个集合被放入你的 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)))