Tg.*_*Tg. 12 python reduce lambda dictionary
我有5个词典,我想要一个他们的键的联合.
alldict = [dict1, dict2, dict3, dict4, dict5]
Run Code Online (Sandbox Code Playgroud)
我试过了
allkey = reduce(lambda x, y: set(x.keys()).union(y.keys()), alldict)
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误
AttributeError: 'set' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)
我做错了吗?我使用普通的forloop但我想知道为什么上面的代码不起作用.
Dun*_*can 42
我认为@chuck已经回答了为什么它不起作用的问题,但更简单的方法是记住该union方法可以采用多个参数:
allkey = set().union(*alldict)
Run Code Online (Sandbox Code Playgroud)
做你想要的没有任何循环或lambdas.
chu*_*uck 10
你的解决方案适用于列表中的前两个元素,但随后dict1又dict2被缩减为一个集合,并将该集合放入lambda中x.所以现在x不再有这个方法keys()了.
解决方案是从一开始就通过使用空集(这恰好是并集的中性元素)初始化减少来使x成为集合.
尝试使用初始化程序:
allkey = reduce(lambda x, y: x.union(y.keys()), alldict, set())
Run Code Online (Sandbox Code Playgroud)
没有任何lambdas的替代方案是:
allkey = reduce(set.union, map(set, map(dict.keys, alldict)))
Run Code Online (Sandbox Code Playgroud)
非功能性神经元的简单策略(双关语):
allkey = []
for dictio in alldict:
for key in dictio:
allkey.append(key)
allkey = set(allkey)
Run Code Online (Sandbox Code Playgroud)
我们可以使用集合推导将这段代码转换为更排序的形式:
allkey = {key for dictio in alldict for key in dictio}
Run Code Online (Sandbox Code Playgroud)
与传统的 for 循环相比,这种单行代码仍然具有很强的可读性。将嵌套循环转换为列表或集合推导式的关键是将内部循环(在嵌套循环中变化更快的那个)写成最后一个索引(即 for key in dictio)。
| 归档时间: |
|
| 查看次数: |
12147 次 |
| 最近记录: |