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

时间:2011-03-09 06:47:34

标签: python dictionary lambda reduce

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

5 个答案:

答案 0 :(得分:40)

我认为@chuck已经回答了为什么它不起作用的问题,但更简单的方法是记住union方法可以采用多个参数:

allkey = set().union(*alldict)

在没有任何循环或lambda的情况下做你想要的。

答案 1 :(得分:9)

您的解决方案适用于列表中的前两个元素,但随后dict1dict2被缩减为一个集合,该集合将作为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()...)

我尝试了这个列表并且它没有用,所以只是把它放在这里给任何人。