如何用Python的map()函数替代嵌套for循环遍历矩阵
用map()替代嵌套for循环实现矩阵元素行最大值判断
需求说明
遍历矩阵每个元素,判断该元素是否大于等于所在行的最大值,输出对应的true或false,要求用Python的map()函数替代原嵌套for循环实现。
原嵌套循环代码(存在参数名不匹配问题)
def f(matrix): r, c = np.shape(array) for col in range(0,c): for row in range(0,r): if array[row][col] >= max(array[row]): print("true") else: print("false")
问题分析
你之前尝试的print(list(map(lambda (x,y): print(x[y]) , A)))写法无法运行,原因有两点:
lambda的参数(x,y)不匹配矩阵的迭代元素——矩阵作为可迭代对象时,每个元素是整行数据,而非(x,y)这样的元组;- 代码逻辑没有处理“每行最大值”的计算与匹配,无法完成判断需求。
解决方案
以下提供两种实现,分别对应行优先遍历和与原代码一致的列优先遍历:
1. 行优先遍历(逐行输出判断结果)
def f(matrix): # 用map计算每行的最大值 row_maxes = list(map(max, matrix)) # 遍历每行与对应最大值,用map生成该行的判断结果 all_results = [] for row, max_val in zip(matrix, row_maxes): row_results = list(map(lambda x: "true" if x >= max_val else "false", row)) all_results.extend(row_results) # 逐个输出结果 for res in all_results: print(res)
2. 列优先遍历(与原代码输出顺序一致)
如果需要和原代码一样先遍历列、再遍历行的输出顺序,可以结合矩阵转置实现:
def f(matrix): # 先计算每行的最大值 row_maxes = list(map(max, matrix)) # 转置矩阵,获取列的迭代器 cols = zip(*matrix) for col in cols: # 用map匹配列元素与对应行的最大值,生成判断结果 col_results = list(map(lambda val, idx: "true" if val >= row_maxes[idx] else "false", col, range(len(col)))) for res in col_results: print(res)
3. 更简洁的链式写法(结合itertools)
如果想彻底减少for循环,可以用itertools.chain扁平化结果:
import itertools def f(matrix): row_with_max = map(lambda row: (row, max(row)), matrix) # 链式拼接所有行的判断结果 all_results = itertools.chain.from_iterable( map(lambda x: "true" if x >= max_val else "false", row) for row, max_val in row_with_max ) for res in all_results: print(res)
内容的提问来源于stack exchange,提问作者maryam_musalam
相关产品推荐
相关产品推荐

