【问题标题】:combining two python lists and aggregating the values by key组合两个 python 列表并按键聚合值
【发布时间】:2017-10-26 20:53:52
【问题描述】:

我在这里看到了两个列表。

a = ['a','b','a']
b = [200,300,300]

当我这样打印时:

print dict(zip(a,b))

我明白了:

{'A': 300, 'B': 300}

如何根据键聚合值以便得到

{'A': 500, 'B': 300}?

【问题讨论】:

    标签: python list function dictionary aggregate


    【解决方案1】:
    result = {}
    for k,v in zip (['a','b','a'], [200,300,300]):
      result[k] = result.get(k,0) + v
    print result
    

    【讨论】:

      【解决方案2】:
      from collections import Counter
      a = ['a','b','a'] 
      b = [200,300,300]
      c = Counter()
      for i, j in zip(a, b):
        c[i] += j
      print(c)
      

      【讨论】:

      • 这读起来更像是一个 defaultdict 方法。使用计数器,使用c.update({i:j})不是更典型吗?
      • @ChrisJohnson:我一直使用defaultdict 方法;我不确定哪个会更惯用。
      【解决方案3】:

      我认为实现目标的明确方法(根据Python's Zen)是:

      from __future__ import print_function
      
      a = ['a','b','a']
      b = [200,300,300]
      d = dict()
      
      for place, key in enumerate(a):
          try:
              d[key] += b[place]
          except KeyError:
              d[key] = b[place]
      print(d)
      

      这给出了您预期的输出:

      {'a': 500, 'b': 300}

      【讨论】:

        【解决方案4】:

        您只需要遍历 zip 以获取键和值并将它们放入字典中。

        a = ['a','b','a']
        b = [200,300,300]
        
        for key, val in zip(a,b):
            if key in combined_dict:
                combined_dict[key] += val
            else:
                combined_dict[key] = val
        
         print(combined_dict)
         => {'a': 500, 'b': 300}
        

        【讨论】:

          【解决方案5】:

          一种方法如下所示,避免使用 zip 功能

          aggregateDict = {}
          a= ['a', 'b', 'a']
          b=[200, 300, 200]
          for i in range(len(a)):
              aggregateDict[a[i]] = aggregateDict.get(a[i], 0) + b[i]
          

          输出将是

          {'a': 400, 'b': 300}
          

          【讨论】:

          • zip 更适合这种情况
          • @AzatIbrakov 我认为 zip 函数比 range() 的开销更大。 Zip 将创建一个临时的元组复合容器列表,因此从内存效率和时间复杂度的角度来看并不好。
          • 如果您使用Python 3,则zip 将创建可迭代,因此没有内存问题,在Python 2 上您应该使用itertools.izip
          • 从列表中获取元素(你得到了两次a[i])显然比使用zip/izip有更多的开销
          猜你喜欢
          • 2017-03-23
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 2018-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多