【发布时间】:2018-01-31 07:24:03
【问题描述】:
我在 Python 3.6 中发现了一件奇怪的事情。以下代码返回
TypeError: +: 'int' 和 'list' 的操作数类型不受支持
arr = [1, 2, 3, 4, 5]
print(sum([[i] for i in arr]))
为什么会这样?如何汇总列表列表?
【问题讨论】:
标签: python python-3.x
我在 Python 3.6 中发现了一件奇怪的事情。以下代码返回
TypeError: +: 'int' 和 'list' 的操作数类型不受支持
arr = [1, 2, 3, 4, 5]
print(sum([[i] for i in arr]))
为什么会这样?如何汇总列表列表?
【问题讨论】:
标签: python python-3.x
这是来自 REPL 的帮助:
>>> help(sum)
sum(iterable, start=0, /)
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
因此,sum 内置函数返回 start 值的总和,即 0,以及 数字 的可迭代对象。 Python 不会事先阻止您滥用函数,它相信您至少在尝试做正确的事情。当然,如果你碰巧传递了一个list-of-lists,第一个列表元素将与0相加,提升:
TypeError: unsupported operand type(s) for +: 'int' and 'list'
确实,如果你传递一个start 参数,一个空列表,在这种情况下,它可以工作:
>>> sum([[e] for e in x], [])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但是,这将是低效的。您应该更喜欢[x for sublist in list_of_lists for x in sublist] 或任何其他线性时间算法。
【讨论】:
首先,您的[[i] for i in arr] 返回[[1], [2], [3], [4], [5]]。
为什么不简单地打印数组的总和:
print(sum(arr))
或者,如果您不想更改您的[[i] for i in arr]:
print(sum([[i] for i in arr], []))
不过,我更喜欢使用 sum(arr),代码更短且可读性强。
【讨论】:
你应该这样使用它。
print (sum(i for i in arr))
如果你像 [i] 一样在 'i' 周围使用括号,这意味着 'i' 是元组中的一个元素,你不可能将整数与列表相加。
TypeError: unsupported operand type(s) for +: 'int' and 'list' --> 这意味着它不能将整数与列表相加。因为当你使用 for 循环时,它每次都会给你一个元素,循环被执行,即一个整数,但你期望一个列表返回给 sum() 函数。因此,它不会那样工作。
【讨论】:
只是做...
arr = [1, 2, 3, 4, 5]
print sum(arr)
您想要汇总多个元素。您已经有一个列表要输入以发挥作用。为什么要使用已有的列表来理解列表?
如果您想将列表展平为一个列表,以便总结所有内容,您可以观看此thread,并使用sum 就像我在上面所做的那样。
【讨论】: