python 二维列表按列求和,按列求最大值,转置,* 星号操作,简便方法,不使用numpy

python3中,二维列表(矩阵)按列求和求最大值二维列表转置的一些操作,不使用numpy库。在LeetCode做题时比较常用。

太长不看版本

# 用于演示的二维列表
>>>a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 按行求最大值
>>> list(map(max, a))
[3, 6, 9]

# 按行求和
>>> list(map(sum, a))
[6, 15, 24]

# 按列求最大值
>>> list(map(max, *a))
[7, 8, 9]

# 按列求和
>>> list(map(sum, zip(*a)))
[12, 15, 18]

# 转置二维列表
>>> [list(col) for col in zip(*a)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

详细介绍

按行计算

在python里,按行求和、求最大值很方便,直接for循环或者直接map函数都可以

>>>a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 按行求最大值
>>>list(map(max, a))
[3, 6, 9]

# 按行求和
>>>list(map(sum, a))
[6, 15, 24]

按列计算

但是如果要按列求和、按列求最大值,则需要转换一下

先看按列求最大值

>>>a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 按列求最大值
>>>list(map(max, *a))
[7, 8, 9]

 原理

map函数作用的时候需要两个参数,第一个是函数,第二个是操作对象

操作对象只有一个的时候:map会依次把函数应用在操作对象的子元素里

操作对象大于一个的时候:map会把每个对象的子元素一起作用(即按列操作)

而  *a  把二维列表a拆开传递给map,map一共拿到3个操作对象,[1, 2, 3], [4, 5, 6], [7, 8, 9],就会按列操作了。此处  *a  和  [1, 2, 3], [4, 5, 6], [7, 8, 9] 外面不加中括号是一样的

>>> list(map(max, [[1,2,3],[4,5,6],[7,8,9]]))
[3, 6, 9]

>>> list(map(max, [1,2,3],[4,5,6],[7,8,9]))  # 二维数组拆开传入,和*a效果一样
[7, 8, 9]

>>> list(map(max, *a))
[7, 8, 9]

但是按列求和不太一样,直接使用星号*会报错

>>> list(map(sum, a))
[6, 15, 24]
>>> list(map(sum, *a))
Traceback (most recent call last):
  File "", line 1, in 
TypeError: sum() takes at most 2 arguments (3 given)

因为需要 *a 传入了3个参数给sum,sum只能一起处理。即运行了 sum(1, 4, 7),而sum只能够这样运行 sum([1, 4, 7]),相当于这样:

>>> sum([1,2,3])
6
>>> sum(1,2,3)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: sum() takes at most 2 arguments (3 given)

所以不如先把二维列表转置一下,使用zip函数即可。然后再求和

>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 二维列表转置(转置后是一个包含3个元组的列表,也可以转成包含列表的列表)
>>> list(zip(*a))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

# 二维列表按列求和
>>> list(map(sum, zip(*a)))
[12, 15, 18]

你可能感兴趣的:(python,numpy,矩阵)