为什么Python用于对列表列表求和时会减少引发TypeError?

时间:2017-09-07 04:14:20

标签: python python-2.7

我的印象是,如果我使用var txt = "Hey" @IBOutlet weak var Text: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. showText() } func showText(){ Text.text = txt } @IBAction func Button(_ sender: UIButton) { txt = "Hello" showText() } ,我会得到列表列表中的元素总和,如下所示:

reduce

但是我收到的错误是:

reduce(lambda x, y: x[0]+y[0], [[1],[2],[3],[4],[5]])

在这种情况下,减少做什么?如果我想总结一下,避免TypeError: 'int' object has no attribute '__getitem__' 循环的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

如果你想像那样使用reduce,你必须提供初始值:

>>> list_of_lists = [[1],[2],[3],[4],[5]]
>>> reduce(lambda x, y: x+y[0], list_of_lists, 0)
15

但请勿使用reduce。只需使用内置的sum

>>> sum(n for sublist in list_of_lists for n in sublist)
15
>>> sum(n for [n] in list_of_lists)  # enforcing 1-element sublists
15

答案 1 :(得分:0)

没有太多理由将所有内容都放在子列表中。这就是你想要的。

reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

如果您所做的只是对列表的元素求和,那么Python就有内置功能。<​​/ p>

sum([1, 2, 3, 4, 5])

如果你真的有理由需要列表列表,那么你需要将累积值作为列表。可以这样想:你传递给reduce的函数通常应该返回一个相同“类型”的值(在这里使用“类型”这个词)作为第一个参数,因为它稍后会传入作为另一个电话的第一个参数。

reduce(lambda x, y: [x[0]+y[0]], [[1], [2], [3], [4], [5]])