2016-08-14 68 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