python: union keys from multiple dictionary?

后端 未结 5 802
终归单人心
终归单人心 2021-02-12 20:49

I have 5 dictionaries and I want a union of their keys.

alldict =  [dict1, dict2, dict3, dict4, dict5]

I tried

allkey = reduce(         


        
相关标签:
5条回答
  • 2021-02-12 20:51

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

    0 讨论(0)
  • 2021-02-12 20:53

    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)))
    
    0 讨论(0)
  • 2021-02-12 21:00

    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.

    0 讨论(0)
  • 2021-02-12 21:01
    set().union(dict1.keys(),dict2.keys()...)
    

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

    0 讨论(0)
  • 2021-02-12 21:05

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

    0 讨论(0)
提交回复
热议问题