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

2024-09-22 14:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有五本字典,我想要一把他们的钥匙。

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


Tags: lambdareduce字典错误keys钥匙unionset
3条回答

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

allkey = set().union(*alldict)

不需要任何循环或lambdas就可以做你想做的事情。

非功能性神经元的简单策略(双关语):

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

您的解决方案适用于列表中的前两个元素,但随后dict1dict2被缩减为一个集合,该集合作为x放入lambda中。所以现在x不再有方法keys()

解决方案是从一开始就让x成为一个集合,方法是用一个空集合(恰好是union的中性元素)初始化reduction。

用初始化器试试:

allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())

没有lambdas的另一种选择是:

allkey = reduce(set.union, map(set, map(dict.keys, alldict)))

相关问题 更多 >