python: union keys from multiple dictionary?

五迷三道 提交于 2019-12-03 06:39:07

Your solution works for the first two elements in the list, but then dict1 and dict2 got reduced into a set and that set is put into your lambda as the x. So now x does not have the method keys() anymore.

The solution is to make x be a set from the very beginning by initializing the reduction with an empty set (which happens to be the neutral element of the union).

Try it with an initializer:

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

An alternative without any lambdas would be:

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

I think @chuck already answered the question why it doesn't work, but a simpler way to do this would be to remember that the union method can take multiple arguments:

allkey = set().union(*alldict)

does what you want without any loops or lambdas.

A simple strategy for non-functional neurons (pun intended):

allkey = []

for dictio in alldict:
    for key in dictio:
        allkey.append(key)

allkey = set(allkey)

We can convert this code to a much sorter form using set comprehensions:

allkey = {key for dictio in alldict for key in dictio}

This one-liner is still very readable in comparison with the conventional for loop. The key to convert a nested loop to a list or set comprehension is to write the inner loop (the one that varies faster in the nested loop) as the last index (that is, for key in dictio).

Just one more way, 'cause what the hay:

a={}; [ a.update(b) for b in alldict ] and a.keys()

or the slightly-more-mysterious

reduce(lambda a, b: a.update(b) or a, alldict, {}).keys()

(I'm bummed that there's no built-in function equivalent to

def f(a,b):
   r = {}
   r.update(a)
   r.update(b)
   return r

is there?)

set().union(dict1.keys(),dict2.keys()...)

I tried the list and it didnt work so just putting it up here for anyone.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!