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