【问题标题】:python: union keys from multiple dictionary?python:来自多个字典的联合键?
【发布时间】:2011-07-11 16:03:14
【问题描述】:

我有 5 个字典,我想要它们的键的并集。

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

【问题讨论】:

    标签: python dictionary lambda reduce


    【解决方案1】:

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

    allkey = set().union(*alldict)
    

    无需任何循环或 lambda 即可满足您的需求。

    【讨论】:

      【解决方案2】:

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

      解决方案是通过使用空集(恰好是并集的中性元素)初始化归约,从一开始就使 x 成为一个集合。

      用初始化器试试:

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

      没有任何 lambda 的替代方法是:

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

      【讨论】:

      • 几乎...尝试 set() 作为初始化程序
      • 或:allkey = reduce(set.union, (set(d.keys()) for d in alldict))
      【解决方案3】:

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

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

      【讨论】:

      • @BjörnPollex 你是对的,(集合)理解在可读性和简洁性方面成功地与功能替代品竞争。
      【解决方案4】:

      还有一种方法,因为干草:

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

      或者稍微神秘一点的

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

      (我很沮丧没有等效的内置函数

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

      在吗?)

      【讨论】:

      • 试试:def f(a, b): return dict(a.items() + b.items())
      【解决方案5】:
      set().union(dict1.keys(),dict2.keys()...)
      

      我试过这个列表,但它没有用,所以把它放在这里给任何人。

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 2023-03-18
        • 2018-10-04
        相关资源
        最近更新 更多