我有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'
我做错了吗?我使用普通的forloop,但我想知道为什么上面的代码不起作用。
答案 0 :(得分:40)
我认为@chuck已经回答了为什么它不起作用的问题,但更简单的方法是记住union
方法可以采用多个参数:
allkey = set().union(*alldict)
在没有任何循环或lambda的情况下做你想要的。
答案 1 :(得分:9)
您的解决方案适用于列表中的前两个元素,但随后dict1
和dict2
被缩减为一个集合,该集合将作为x
放入您的lambda中。所以现在x
已经没有方法keys()
了。
解决方案是通过使用空集(这恰好是并集的中性元素)初始化缩减,使x成为一个集合。
尝试使用初始化程序:
allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())
没有任何lambdas的替代方案是:
allkey = reduce(set.union, map(set, map(dict.keys, alldict)))
答案 2 :(得分:2)
非功能性神经元的简单策略(双关语):
allkey = []
for dictio in alldict:
for key in dictio:
allkey.append(key)
allkey = set(allkey)
我们可以使用set comprehensions将此代码转换为更多的分类器:
allkey = {key for dictio in alldict for key in dictio}
与传统的for循环相比,这种单行程仍然非常易读。
将嵌套循环转换为列表或设置理解的关键是将内部循环(在嵌套循环中变化得更快的循环)写为最后一个索引(即for key in dictio
)。
答案 3 :(得分:0)
还有一种方法,'因为什么干草:
a={}; [ a.update(b) for b in alldict ] and a.keys()
或略微更神秘的
reduce(lambda a, b: a.update(b) or a, alldict, {}).keys()
(我很遗憾没有相当于
的内置功能def f(a,b):
r = {}
r.update(a)
r.update(b)
return r
有吗?)
答案 4 :(得分:0)
set().union(dict1.keys(),dict2.keys()...)
我尝试了这个列表并且它没有用,所以只是把它放在这里给任何人。