【问题标题】:Python: how to find duplicates and sum their values? [duplicate]Python:如何查找重复项并将其值求和? [复制]
【发布时间】:2015-11-26 01:52:01
【问题描述】:
[('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]

例如,我有上面的元组列表,我如何找到重复项(即“Visa”)并将它们的值求和(即 980.5+215.0)?输出应该是:

[('Visa', 1195.5), ('Rogers', 61.5)]

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:

    使用字典:

    >>> data = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
    >>> result = {}
    >>> for card, value in data:
            total = result.get(card, 0) + value
            result[card] = total
    
        
    >>> print result.items()
    [('Visa': 1195.5), ('Rogers': 61.5)]
    

    【讨论】:

      【解决方案2】:

      看来大家都忘了collections.Counter

      from collections import Counter
      
      
      c = Counter()
      for card, val in lst:
          c[card] += val
      print(list(c.items()))
      
      # [('Visa', 1195.5), ('Rogers', 61.5)]
      

      【讨论】:

      • 我试图将它用于 map-reduce,但错误提示“解包的值太多”。
      • @ForgottenApe:听起来你的lst 不是一对可迭代的;如果您有一个 liststr 并试图计算唯一字符串,而不是 tuples 的 list 代表一个键和关联的数值,您会看到该错误;使用 list 的任何值都是包含两个值的可迭代值会导致问题,导致此问题的常见错误是当它是 strlist 时(循环试图解包)。如果您要计算单个项目的 list,而不是键 + 数值,则只需执行 c = Counter(lst) 即可。
      【解决方案3】:

      collections.defaultdict 将是最有效的方式:

      from collections import defaultdict
      
      l= [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
      
      d = defaultdict(float)
      for k,v in l:
          d[k] += v
      

      输出:

      defaultdict(<class 'float'>, {'Visa': 1195.5, 'Rogers': 61.5})
      

      【讨论】:

        【解决方案4】:
        data = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
        sum = {}
        for item in data:
            if not item[0] in sum:
                  sum[ item[0] ] = 0
            sum[ item[0] ] += item[1]
        print sum.items()
        

        【讨论】:

        • 要添加到这个答案,如果不希望打印,那么list(sum.items()) 会解决问题。 (sum.items() 不是列表。)
        【解决方案5】:

        使用集:

        li=[('Rogers', 10), ('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
        s=set([i[0] for i in li])
        
        x=[]
        for i in s:
            sum=0
            for j in li:    
                if i == j[0]:
                    sum+=j[1]
            x.append(sum)
        
        final_list=zip(s,x)
        print final_list
        

        输出:

        [('Visa', 1195.5), ('Rogers', 61.5)]
        

        【讨论】:

          【解决方案6】:

          如果您想保持列表的顺序,那么我建议您不要使用字典。

          lst = [('Visa', 980.5), ('Rogers', 61.5), ('Visa', 215.0)]
          
          lst2 = [(tup[0], sum([val for n, val in lst if n == tup[0]])) for tup in lst]
          
          res = []
          for tup in lst2:
              if tup not in res:
                  res.append(tup)
          
          print(res)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 2016-07-21
            • 1970-01-01
            • 2019-12-27
            • 1970-01-01
            • 1970-01-01
            • 2021-04-12
            相关资源
            最近更新 更多