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

问题描述 投票:0回答:6

我有 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,但我想知道为什么上面的代码不起作用。

python dictionary lambda reduce
6个回答
74
投票

我认为 @chuck 已经回答了为什么它不起作用的问题,但更简单的方法是记住

union
方法可以接受多个参数:

allkey = set().union(*alldict)

无需任何循环或 lambda 即可完成您想要的操作。


10
投票

您的解决方案适用于列表中的前两个元素,但随后

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)))

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
)。


2
投票
set().union(dict1.keys(),dict2.keys()...)

我尝试了该列表,但它不起作用,所以只是将其放在这里供任何人使用。


2
投票

如果您只想联合 2 个字典的键,您可以使用运算符

|

引自文档

返回一个新集合,其中包含该集合和所有其他元素中的元素。

示例:

all_keys = dict1.keys() | dict2.keys()

1
投票

还有一种方法,因为干草:

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

有吗?)

© www.soinside.com 2019 - 2024. All rights reserved.