如何获取矩阵中3个元素的最小和?能否使用zip实现?
问题描述
给定矩阵 A = [[1, 2, 4], [3, 5, 6], [7,8,9]],需要定义函数 sumof(A,3) 来寻找3个元素的最小和(示例中最小和为 1+2+3=6,输出为 (1,2,3)),请问是否可以使用 zip 函数实现该需求?
回答
当然可以用 zip 函数实现!虽然 zip 本身主要用于将可迭代对象按位置打包,但搭配一些基础的Python操作,就能轻松完成这个需求。下面我给你两种具体的实现思路:
思路一:结合 zip 与列表推导式扁平化矩阵
我们可以先用 zip(*A) 将矩阵转置(把原矩阵的列转换为元组),再通过列表推导式把所有元素收集起来,最后排序取前3个最小元素:
def sumof(A, n): # 用 zip(*A) 转置矩阵,遍历每个列元组收集所有元素 all_elements = [num for col in zip(*A) for num in col] # 排序后取前n个最小元素,转为元组返回 smallest_elements = sorted(all_elements)[:n] return tuple(smallest_elements) # 测试 A = [[1, 2, 4], [3, 5, 6], [7,8,9]] print(sumof(A, 3)) # 输出: (1, 2, 3)
思路二:结合 zip 与 itertools.chain 扁平化矩阵
如果偏好更简洁的迭代写法,可以用 itertools.chain 来快速扁平化转置后的矩阵元素:
import itertools def sumof(A, n): # zip(*A) 转置矩阵,chain.from_iterable 扁平化所有元素 all_elements = itertools.chain.from_iterable(zip(*A)) smallest_elements = sorted(all_elements)[:n] return tuple(smallest_elements) # 测试 A = [[1, 2, 4], [3, 5, 6], [7,8,9]] print(sumof(A, 3)) # 输出: (1, 2, 3)
为什么 zip 能在这里起作用?
zip(*A) 的作用是转置矩阵,原矩阵的每一列会被打包成一个元组(比如原矩阵的第一列 [1,3,7] 会变成元组 (1,3,7))。虽然我们直接遍历原矩阵的行也能收集所有元素,但既然你明确询问能否用 zip,这就是一种完全可行的实现方式——本质是通过转置的方式,用 zip 作为元素收集的中间步骤。
需要注意的是,这个方案适用于“从矩阵中任选3个不同元素找最小和”的场景,如果你的需求是其他规则(比如每行必须选一个元素),那需要调整逻辑,但针对你给出的示例,上面的代码完全符合要求。
内容的提问来源于stack exchange,提问作者user6882757
相关产品推荐
相关产品推荐

