我有几个列表,存储在一个列表中,它本身是在未知数量的迭代循环中创建的,我需要将它们全部串联起来。例:
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] 删除。
我来说两句