【问题标题】:How to sum the second elements of the list if the first elements in the list are matching如果列表中的第一个元素匹配,如何对列表的第二个元素求和
【发布时间】:2016-11-25 19:09:51
【问题描述】:

输入:

[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]

输出:

[["US", 6], ["UK", 5], ["FR", 4]]

如果列表中的第一个元素匹配,我想对列表的第二个元素求和。我试过使用字典和集合,但我想不出一个逻辑。这可以在 Hadoop 或 Spark 中轻松完成,因为框架将承担 reduce 部分,我们很容易对值列表求和。但我不确定如何在 python 中做。有人可以帮忙吗?

注意:我正在寻找优化的解决方案。没有使用很多 for 循环。

什么都试过了:

import collections 
l1 = [["US", 2], ["UK", 3], ["FR", 4]] 
l2 = [["US", "us@mail.com"], ["UK", "uk@mail.com"], ["BR", "fr@mail.com"]] 
l1 = dict(l1) 
l2 = dict(l2) 
l1set = set(l1.keys()) 
l2set = set(l2.keys()) 
for i in l1set & l2set: 
    print l2[i]

【问题讨论】:

  • 请展示你的作品。你试过什么?
  • 看来@bernie 和我想出了不同的解决方案。您要寻找的结果是什么?
  • 您好@HaiVu,正如我所说,我无法提出逻辑。但这是我尝试过的简单列表。导入集合 l1 = [["US", 2], ["UK", 3], ["FR", 4]] l2 = [["US", "us@mail.com"], ["UK" , "uk@mail.com"], ["BR", "fr@mail.com"]] l1 = dict(l1) l2 = dict(l2) l1set = set(l1.keys()) l2set = set( l2.keys()) for i in l1set & l2set: print l2[i]
  • @naveench,下次请更新你的帖子,不要像这样在评论中添加代码。
  • 您尝试的代码与您提出的问题几乎没有关系。

标签: python


【解决方案1】:
import collections as co
l = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
dd = co.defaultdict(int)
for i in l:
  dd[i[0]] += i[1]
newlist = [list((k,v)) for k,v in dd.items()]

结果:

>>> newlist
[['FR', 4], ['UK', 5], ['US', 6]]

编辑:
如果您可以使用pandas,请按照https://stackoverflow.com/a/38497749/42346执行以下操作:

import pandas as pd
newlist = [list((k,v)) for k,v in pd.DataFrame(l,columns=['a','b']).groupby('a').b.sum().to_dict().items()]

结果:

>>> newlist
[['FR', 4], ['US', 6], ['UK', 5]]

【讨论】:

    【解决方案2】:

    做一个列表理解:

    myNewList = [i for i in listOne if i in listTwo]
    

    这是一个例子:

    listOne = [2, 4, 5, 7]
    listTwo = [2, 3, 5, 6]
    
    print ([i for i in listOne if i in listTwo])
    # prints [2, 5]
    

    这是我对你的两个列表运行它时得到的结果:

    $ python test.py
    [['FR', 4]]
    

    【讨论】:

      【解决方案3】:

      首先,如果你不知道怎么做,你不需要优化,但我会给自己一个 5 秒的挑战来回答你的问题 :)

      from collections import defaultdict
      b=defaultdict(int)
      a=[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
      for i in a: b[i[0]]+=i[1]
      
      #now the way you access your sum is 
      print b['UK'] #prints 5
      
      #if you specificlly need that format
      output = [[n,b[n]] for n in b]
      

      【讨论】:

        【解决方案4】:

        您可以使用itertools.groupby、reduce 和列表推导的组合,如下所示:

        a = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
        a.sort()
        b = []
        for k, g in groupby(a, lambda x: x[0]):
            b.append([k, reduce(lambda p, c: p + c, [y[1] for y in g])])
        

        【讨论】:

          【解决方案5】:

          按名称分组,将每个组的数字相加:

          from itertools import groupby
          from operator import itemgetter
          
          my_list = [["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
          
          summary_list = []
          
          for name, group in groupby(sorted(my_list), key=itemgetter(0)): 
             summary_list.append([name, sum(item[1] for item in group)])
          
          print(summary_list)
          

          输出:

          Python 3.5.1 (default, Dec 2015, 13:05:11)
          [GCC 4.8.2] on linux
          
          [['FR', 4], ['UK', 5], ['US', 6]]
          

          在线试用:https://repl.it/Ceh6/1

          【讨论】:

            【解决方案6】:

            从这里开始:

              ll =[["US", 2], ["UK", 3], ["FR", 4], ["US", 2], ["US", 2], ["UK", 2]]
            

            试试这个:

             dd = {k:0 for k in dict(ll).keys()}
             for x in ll: dd[x[0]] += x[1]
             dd
             {'FR': 4, 'UK': 5, 'US': 6}
            
             [[k,v] for k,v in  dd.iteritems()]
            
             [['FR', 4], ['US', 6], ['UK', 5]]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-03-07
              • 2022-08-18
              • 1970-01-01
              • 2023-02-01
              • 2015-04-04
              • 2015-05-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多