【问题标题】:Summing a list in Python - within a tuple and another list在 Python 中对列表求和 - 在一个元组和另一个列表中
【发布时间】:2019-06-01 20:20:03
【问题描述】:

不确定它是否是重复的 - 如果是,将删除,只是还没有找到适合这种特定情况的一个。我有一个充满元组的复杂列表,其中包含字符串和列表。

我需要用 int 值替换最深的列表,它们是这些列表的总和。我已经尝试了六种循环组合来解决它 - 似乎没有任何效果。

[('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]

需要成为:

[('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]

这样我就可以返回按总和列表的值排序的新列表组合。

【问题讨论】:

    标签: python list loops tuples


    【解决方案1】:

    使用map

    例如:

    lst = [('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]
    print(list(map(lambda x: (x[0], sum(x[1])), lst)))
    

    list comprehension

    例如:

    print([(i[0], sum(i[1])) for i in lst])
    

    输出:

    [('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]
    

    【讨论】:

      【解决方案2】:
      oldlst = [('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]
      
      newlst = list([(i[0], sum(i[1])) for i in oldlst])
      

      检查here

      【讨论】:

        【解决方案3】:

        您可以使用以下内容进行简洁易读的理解:

        [(abbr, sum(t)) for abbr, t in l]
        

        结果:

        [('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]
        

        【讨论】:

        • 这比其他两个使用索引实现的要好。它看起来更干净:)
        【解决方案4】:

        通过使用collections.defaultdict.

        from collections import defaultdict
        xList = [('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]
        testDict = defaultdict(int)
        for key, val in xList:           
                testDict[key] = val[0] + val[1]
        
        print(testDict.items())
        

        输出:

        【讨论】:

        • 好的,当有更简单和更详细的方法时,为什么会有人这样做呢?对于一个简单的任务来说,这似乎很臃肿。你真的需要为此导入一个模块吗?
        • 我能说什么,我不喜欢走简单的路! :p
        【解决方案5】:
        lst = [('MED', [1, 1]),('COP', [3, 1]),('GRO', [1, 5]),('RRE', [5, 3]),('PRO', [4, 6])]
        
        print [(text, sum(num)) for text, num in lst]
        

        结果:

        [('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]
        

        【讨论】:

          【解决方案6】:

          让我们使用列表推导来解决它 -

          myList = [('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]
          myList_out = [(i[0],sum(i[1])) for i in myList]
          myList_out
              [('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]
          

          【讨论】:

            【解决方案7】:

            试试这个:

            l1 = [('MED', [1, 1]), ('COP', [3, 1]), ('GRO', [1, 5]), ('RRE', [5, 3]), ('PRO', [4, 6])]
            
            mod_l1 = [(abbr, sum(t)) for abbr, t in l1]
            
            required_l1 = sorted(mod_l1, key=lambda order: order[1])
            

            结果:

            [('MED', 2), ('COP', 4), ('GRO', 6), ('RRE', 8), ('PRO', 10)]
            

            【讨论】:

              猜你喜欢
              • 2010-10-12
              • 2014-09-17
              • 1970-01-01
              • 2011-05-20
              • 2013-07-06
              • 1970-01-01
              • 2022-12-31
              • 2013-01-29
              • 2011-11-09
              相关资源
              最近更新 更多