为什么需要提供一个空列表才能将列表与sum()合并?

扎克

我有几个列表,存储在一个列表中,它本身是在未知数量的迭代循环中创建的,我需要将它们全部串联起来。例:

lists = [range(i) for i in range(1,5)]
lists
Out[1]: [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]

所以,现在我想将它们变成一个单一的列表。我可以通过添加它们来做到这一点:

biglist = lists[0] + lists[1] + lists[2] + lists[3]

...但是很快就会变得无聊。我可以编写一个for循环访问内部列表的循环:

biglist = []
for smallist in lists:
    biglist += smallist
biglist
Out[2]: [0, 0, 1, 0, 1, 2, 0, 1, 2, 3] 

这行得通,但需要三行代码并处理中间结果,因此它无法内联工作,并妨碍了使用功能代码。

但是由于我需要的是互相添加一些列表,并且在Python中已经有一个内置函数,因此可以使用sum(lists)-但是,这是我可以使用的原因

sum(lists)
Traceback (most recent call last):
  File "D:\program_files\Anaconda\envs\SPINE_dev\lib\site-packages\IPython\core\interactiveshell.py", line 2878, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-12-827ffc5ab7d2>", line 1, in <module>
    sum(lists)
TypeError: unsupported operand type(s) for +: 'int' and 'list'

怎么了 这不行吗?我一直在寻找答案,但只找到了这个技巧,它有效,但没有解释:

sum(lists, [])
Out[3]: [0, 0, 1, 0, 1, 2, 0, 1, 2, 3]

请注意,最初的提示是使用list(sum(lists, [])),但如果不使用list()它似乎也可以正常工作,看起来也更好。

所以,问题是:为什么我需要提供一个空白列表?第二个问题:为什么有人建议在类型转换中包装该语句,并且在某些情况下(或Python版本)有必要?

我正在使用Python 2.7.10

布兰迪齐

如果查看sum()的文档,您会看到,如果不传递空列表,该参数的默认值(称为start)为零:

 sum(iterable, /, start=0)

然后,sum()将从您提供的列表中获取每个值,并首先尝试将其值加起来start这意味着它将尝试将零加到您列表的第一个元素,这也是一个列表。当您尝试向数字添加列表时会发生什么?TypeError

>>> 0 + [1, 2, 3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

当您传递空列表时,第一件事sum()就是将空列表加到您的第一个列表中。在这种情况下,应该没有错误(尽管正如预期的那样,结果与第一个元素没有什么不同):

>>> [] + [1, 2, 3]
[1, 2, 3]

(也就是说,我要指出的是,在现实世界中的问题中,使用可能会更好itertools.chain(),这比创建整个新列表更有效sum()。但是,对于您在问题中的示例来说,这应该不是问题。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 Python 3 中的 map 对象需要被转换为一个列表才能理解?

为什么它创建一个空列表()

为什么ForkJoinPool :: shutdownNow返回一个空列表?

为什么这个 for 循环返回一个空列表?

为什么retainAll()返回一个空列表?

为什么需要定义一个函数才能将其传递给不调用它的模板函数?

为什么向这个 Haskell 函数提供一个空列表会导致编译器错误?

为什么我们需要序列化对象才能将一个活动传递给Android中的另一个活动

即使master只包含一个空的README,为什么我不能将git dev分支合并到master?

为什么我的 ArrayBlockingQueue 在放入一个列表后会导致一个空队列?

为什么列表保留C#中另一个空列表的值

为什么列表索引-0形成一个空列表?

为什么我的代码会生成一个空列表列表?

为什么我的for循环在列表末尾返回一个空列表值?

我怎样才能将这两者结合成一个列表理解?

遍历两个列表并添加到结果列表将返回一个空列表。为什么?

使用地图和箭头功能将2个列表合并为一个

为什么与空列表连接会返回一个列表,而与新列表连接时却不会?

为什么我的列表需要会话中的空列表才能显示添加到该列表的所有项目?

为什么我的代码不起作用将多个列表合并为一个

为什么列表中有一个列表对象?

为什么需要在链接列表中存储下一个项目指针

为什么需要在 tensorflow run.session() 中将张量变成一个列表

为什么这里需要一个尾随逗号来传递 *args 参数中的列表?

在Javascript中,为什么Object.getPrototypeOf([1,2])返回一个空列表?

为什么docker-machine显示一个空列表?

如果在函数中添加“ else”,为什么会得到一个空列表?

为什么我的回溯总是返回一个空列表?

为什么分配一个空列表(例如[] =“”)不是错误?