考虑一下这个问题:
The grid is:
[ [3, 0, 8, 4],
[2, 4, 5, 7],
[9, 2, 6, 3],
[0, 3, 1, 0] ]
The max viewed from top (i.e. max across columns) is: [9, 4, 8, 7]
The max viewed from left (i.e. max across rows) is: [8, 7, 9, 3]
我知道如何在Python中定义网格:
maximums = [[0 for x in range(len(grid[0]))] for x in range(len(grid))]
跨行获取最大值看起来很简单:
max_top = [max(x) for x in grid]
但是如何跨列获得最大值?
此外,我需要找到一种在线性空间O(M + N)中这样做的方法,其中MxN是矩阵的大小。
答案 0 :(得分:2)
使用zip
:
result = [max(i) for i in zip(*grid)]
在Python中,*
不是指针,而是用于解包传递给对象参数的结构或指定对象可以接收可变数量的项。例如:
def f(*args):
print(args)
f(434, 424, "val", 233, "another val")
输出:
(434, 424, 'val', 233, 'another val')
或者,给定一个iterable,每个项目都可以插入其相应的函数参数:
def f(*args):
print(args)
f(*["val", "val3", 23, 23])
>>>('val', 'val3', 23, 23)
zip
"转置"数据列表,即每行成为一列,反之亦然。
答案 1 :(得分:1)
您可以使用numpy
:
import numpy as np
x = np.array([ [3, 0, 8, 4],
[2, 4, 5, 7],
[9, 2, 6, 3],
[0, 3, 1, 0] ])
print(x.max(axis=0))
输出:
[9 4 8 7]
你说你需要在O(m + n)空间(不使用numpy)这样做,所以这是一个不重建矩阵的解决方案:
max = x[0]
for i in x:
for j, k in enumerate(i):
if k > max[j]:
max[j] = k
print(max)
输出:
[9, 4, 8, 7]
答案 2 :(得分:0)
我也想出了一条捷径:
转置矩阵,然后在行上取最大值:
grid_transposed = [[grid[j][i] for j in range(len(grid[0]))] for i in range(len(grid))]
max_left = [max(x) for x in grid]
但是这又需要O(M*N)
空间来改变矩阵。
我不想使用numpy,因为任何作业都不允许使用外部库。
答案 3 :(得分:0)
最简单的方法是使用numpy的数组最大值:
array.max(0)
答案 4 :(得分:0)
像这样的东西是双向的,而且很容易阅读:
# 1.
maxLR, maxTB = [], []
maxlr, maxtb = 0, 0
# max across rows
for i, x in enumerate(grid):
maxlr = 0
for j, y in enumerate(grid[0]):
maxlr = max(maxlr, grid[i][j])
maxLR.append(maxlr)
# max across columns
for j, y in enumerate(grid[0]):
maxtb = 0
for i, x in enumerate(grid):
maxtb = max(maxtb, grid[i][j])
maxTB.append(maxtb)
# 2.
row_maxes = [max(row) for row in grid]
col_maxes = [max(col) for col in zip(*grid)]