Python循环调用函数,如何将输入与函数值保存为矩阵格式?
问题:将多变量函数的求值结果整理为指定矩阵格式
我定义了一个函数f,想要在x、y、z的所有组合下对其求值,一开始用了列表推导式:
x = range(60,70) y = range(0,5) z = ["type1", "type2"] results = [f(v,w,j) for v in x for w in y for j in z]
现在results是一个长向量,但我希望得到如下格式的扁平矩阵(每个变量组合对应四个连续元素:变量值+函数结果):
[x1, y1, z1, f(x1,y1,z1), x2, y1, z1, f(x2,y1,z1), ..., x9, y1, z1, f(x9,y1,z1), x1, y2, z1, f(x1,y2,z1), x2, y2, z1, f(x2,y2,z1), ..., x9, y2, z1, f(x9,y2,z1), x1, y1, z2, f(x1,y1,z2), ...]
要覆盖所有可能的组合。我尝试了以下代码:
z = [] for v in x: for w in y: for j in z: z = [v, w, j, f(v,w,j)]
这段代码格式看似正确,但仅能得到一种场景的结果,恳请提供解决指导。
解决方案
你的问题主要有两个点:一是每次循环都用z = [v, w, j, f(v,w,j)]直接覆盖了列表,而不是把新结果追加进去;二是你把循环变量z和结果列表用了同一个名字,这会导致循环提前“跑偏”——第一次赋值后z就变成了四元素列表,不再是原来的["type1", "type2"]了,后续循环自然无法正常执行。
这里给你两种贴合需求的解决办法:
方法1:修改循环代码,正确追加结果
先把结果列表的名字和变量z区分开,比如叫final_results,然后用extend方法把每个组合的四个元素依次加入列表,同时调整循环顺序来匹配你想要的输出结构:
x = range(60,70) y = range(0,5) z_types = ["type1", "type2"] # 改名避免冲突 final_results = [] # 按z→y→x的顺序遍历,确保输出顺序符合你的要求 for j in z_types: for w in y: for v in x: # 把当前组合的四个元素一次性加入结果列表 final_results.extend([v, w, j, f(v, w, j)])
这样输出的final_results会先排列所有z1下的y1对应x全组合,再y2对应x全组合,以此类推,最后处理z2的所有组合,完全匹配你期望的格式。
方法2:用列表推导式+链式合并实现
如果你偏好简洁的写法,可以用嵌套列表推导式生成每个组合的四元素子列表,再用itertools.chain把所有子列表合并成一个扁平大列表:
from itertools import chain x = range(60,70) y = range(0,5) z_types = ["type1", "type2"] final_results = list(chain.from_iterable( [v, w, j, f(v, w, j)] for j in z_types for w in y for v in x ))
这种写法和方法1的逻辑完全一致,只是更紧凑,最终得到的final_results同样是你需要的扁平矩阵格式。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

