我有 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,但我想知道为什么上面的代码不起作用。
我认为 @chuck 已经回答了为什么它不起作用的问题,但更简单的方法是记住
union
方法可以接受多个参数:
allkey = set().union(*alldict)
无需任何循环或 lambda 即可完成您想要的操作。
您的解决方案适用于列表中的前两个元素,但随后
dict1
和 dict2
被缩减为一个集合,并且该集合作为 x
放入您的 lambda 中。所以现在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)))
针对非功能性神经元的简单策略(双关语):
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
)。
set().union(dict1.keys(),dict2.keys()...)
我尝试了该列表,但它不起作用,所以只是将其放在这里供任何人使用。
如果您只想联合 2 个字典的键,您可以使用运算符
|
。
引自文档:
返回一个新集合,其中包含该集合和所有其他元素中的元素。
示例:
all_keys = dict1.keys() | dict2.keys()
还有一种方法,因为干草:
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
有吗?)