【问题标题】:sum for list of lists列表列表的总和
【发布时间】:2012-10-31 08:18:10
【问题描述】:

我正在寻找 python 中的方法来汇总仅包含整数的列表列表。 我看到sum() 方法仅适用于列表,但不适用于列表列表。 有什么适合我的吗?

谢谢

【问题讨论】:

    标签: python list methods


    【解决方案1】:

    您可以在此处将sum() 与生成器表达式一起使用:

    In [18]: lis = [[1, 2], [3, 4], [5, 6]]
    
    In [19]: sum(sum(x) for x in lis)
    Out[19]: 21
    

    或:

    In [21]: sum(sum(lis, []))
    Out[21]: 21
    

    timeit比较:

    In [49]: %timeit sum(sum(x) for x in lis)
    100000 loops, best of 3: 2.56 us per loop
    
    In [50]: %timeit sum(map(sum, lis))
    100000 loops, best of 3: 2.39 us per loop
    
    In [51]: %timeit sum(sum(lis, []))
    1000000 loops, best of 3: 2.21 us per loop
    
    In [52]: %timeit sum(chain.from_iterable(lis))       # winner 
    100000 loops, best of 3: 1.43 us per loop
    
    In [53]: %timeit sum(chain(*lis))
    100000 loops, best of 3: 1.55 us per loop
    

    【讨论】:

    • 作为解释,这是通过使用 generator expression 将每个单独列表的总和相加来实现的。
    • 请注意,可读性应始终胜过性能,除非它已被证明是瓶颈。
    • 另请注意,第二个版本通过将列表连接在一起以展平它们,然后对展平的列表求和。虽然这在 CPython 中可能很快,但不能保证这种扁平化列表的方法在其他实现中有效,因此itertools.chain.from_iterable() 将被认为是更可取的(并且是recommended over sum() in the Python docs 用于此用途)。
    • @Lattyware itertools.chain.from_iterable() 在我进行了一些编辑后也成为了其中最快的。
    【解决方案2】:
    import itertools
    
    sum(itertools.chain.from_iterable([[1,2],[3,4],[5,6]]))
    

    itertools.chain 将可迭代的一层展平(这就是您在此处所需要的),因此sum 会得到包含子列表的列表。

    【讨论】:

    • 作为解释,这是通过展平列表,然后对所有包含值的新迭代求和来实现的。
    【解决方案3】:

    sum(map(sum, my_list))

    这会对第一个列表的每个元素进行求和,然后将结果再次放入求和中。

    【讨论】:

      【解决方案4】:
      l = [[1,2,3], [3,4,5], [3,5,6]]
      total = sum([sum(x) for x in l])
      

      【讨论】:

        【解决方案5】:
        import re
        #print sum( [ ****** *** * in **********('[0-9]+',**************************.read()) ] )
        
        name = raw_input("Enter file:")
        if len(name) < 1 : name = "sam.txt"
        handle = open(name)
        #handle = handle.read()
        num = list()
        total = 0
        for line in handle:
            line = line.rstrip()
            if len(re.findall('([0-9]+)', line))== 0: continue
            num.append(re.findall('([0-9]+)', line))
        
        
        
        print sum(sum(num,[]))
        

        【讨论】:

          【解决方案6】:
          import re
          print sum( [int(i) for i in re.findall('[0-9]+', open("regex_sum_301799.txt").read()) ] )
          

          示例文件来源:http://python-data.dr-chuck.net/regex_sum_301799.txt

          【讨论】:

            猜你喜欢
            • 2012-11-26
            • 2019-03-22
            • 1970-01-01
            • 2023-01-11
            • 1970-01-01
            • 2023-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多