Q:

python: union keys from multiple dictionary?

I have 5 dictionaries and I want a union of their keys.
alldict =  [dict1, dict2, dict3, dict4, dict5]

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

but it gave me an error
AttributeError: 'set' object has no attribute 'keys'

Am I doing it wrong ?  I using normal forloop but I wonder why the above code didn't work.

A:

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:

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

A:

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

