2012-11-11 120 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,[]))