我很确定应该有更多的Pythonic方法 - 但是我想不出一个:如何将二维列表合并到一维列表中?类似于zip/map但有两个以上的迭代器.
示例 - 我有以下列表:
array = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
我希望有
result = [12, 15, 18] # [1+4+7, 2+5+8, 3+6+9]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我想出的是:
def add_list(array):
number_items = len(array[0])
result = [0] * number_items
for index in range(number_items):
for line in array:
result[index] += line[index]
return result
Run Code Online (Sandbox Code Playgroud)
但对我来说,这看起来并不是非常优雅/ Pythonic.除了不检查2D阵列中的所有"线"是否具有相同的长度,可以相互添加等等.有什么更好的方法呢?
Cha*_*iam 63
[zip(*array)中值的总和(值)非常标准.
这可能有助于您理解它:
In [1]: array=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [2]: array
Out[2]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [3]: *array
------------------------------------------------------------
File "<ipython console>", line 1
*array
^
<type 'exceptions.SyntaxError'>: invalid syntax
Run Code Online (Sandbox Code Playgroud)
一元星不是运营商本身.它将数组元素解包为函数调用的参数.
In [4]: zip(*array)
Out[4]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Run Code Online (Sandbox Code Playgroud)
zip()是一个内置函数
In [5]: zip(*array)[0]
Out[5]: (1, 4, 7)
Run Code Online (Sandbox Code Playgroud)
zip返回的列表的每个元素都是您想要的一组数字.
In [6]: sum(zip(*array)[0])
Out[6]: 12
In [7]: [sum(values) for values in zip(*array)]
Out[7]: [12, 15, 18]
Run Code Online (Sandbox Code Playgroud)
如果你做了很多这样的事情,你想要了解scipy.
>>> import scipy
>>> sum(scipy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))
array([12, 15, 18])
Run Code Online (Sandbox Code Playgroud)
将自动检查所有阵列大小.总和是用纯C完成的,所以它非常快. scipy数组也非常有效.
缺点是你依赖于一个相当复杂的第三方模块.但对于许多目的而言,这是一个非常好的权衡.