2016-08-14 66 views
2
的列表中所有列出的總規模

我的數據結構看起來如下蟒蛇減少:發現裏面的元組

itemsData = [('data1', [1, 2, 3, 4]), ('data2', [1, 2]), ('data3', [1, 2, 3])] 

我想找到在上面的元組的列表項的總數。對於上面的例子,LEN([1,2,3,4] + LEN([1,2])+ LEN([1,2,3])= 9

reduce(lambda x,y: len(x[1]) + len(y[1]), itemsData) 

錯誤我得到的是

TypeError: 'int' object has no attribute '__getitem__' 

回答

4

我會解釋爲什麼你的代碼不能正常工作

https://docs.python.org/2/library/functions.html#reduce

左參數x是累計值和正確的說法,Y,從迭代

所以在第一次迭代,更新值的代碼 len(x[1]) + len(y[1])作品因爲x=('data1', [1, 2, 3, 4])y=('data2', [1, 2]),並且結果是6

然而,在第二迭代,你得到x=6,y=('data3', [1, 2, 3])], 所以len(x[1])是無效的。

使用減少正確的代碼,是

reduce(lambda x,y: x+len(y[1]), itemsData, 0) 

這工作,因爲

1st iteration ... x = 0, y = ('data1', [1, 2, 3, 4]), result = 4 
2nd iteration ... x = 4, y = ('data2', [1, 2]), result = 6 
3rd iteration ... x = 6, y = ('data3', [1, 2, 3]), result = 9 
4

你可以簡單地嘗試:

sum([len(elem[1]) for elem in itemsData]) 

>>> itemsData = [('data1', [1, 2, 3, 4]), ('data2', [1, 2]), ('data3', [1, 2, 3])] 
>>> sum([len(elem[1]) for elem in itemsData]) 
9 
+2

沒有必要構建長度的中間列表。考慮「sum(len(x [1])for x in xs)」。 – folkol