2012-11-11 86 views
2

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

谢谢

回答

7

可以使用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 
+0

谢谢大家的帮助! – user1816377

+0

作为解释,这是通过使用[生成器表达式](http://www.youtube.com/watch?v=pShL9DCSIUw)将每个单独列表的总和相加来实现的。 –

+0

请注意,可读性应该总是胜过性能,除非它是一个已被证实的瓶颈。 –

2

sum(map(sum, my_list))

这将运行第一个列表中的每个元素的总和,然后把结果与那些进入和一次。

1
l = [[1,2,3], [3,4,5], [3,5,6]] 
total = sum([sum(x) for x in l]) 
3
import itertools 

sum(itertools.chain.from_iterable([[1,2],[3,4],[5,6]])) 

itertools.chain变平迭代的一个水平(这是所有你所需要的),所以sum得到与细分的子列表清单。

+0

作为解释,这个工作是通过展开列表,然后总结所有包含值的新迭代。 –

0
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,[]))