如何单次遍历Python zip列表,将双函数结果分别存入不同列表?
解决方案:一次性遍历生成两个结果列表
你的思路没问题,但原来的列表推导式写法不符合Python的赋值规则——它会生成一个包含元组的列表,没法直接拆成两个单独的结果列表。这里有两种可行的实现方式:
方法1:列表推导式 + zip(*...)解包
利用列表推导式先生成每个元素为(加法结果, 减法结果)的临时列表,再通过zip(*...)把所有加法结果和减法结果分别聚合起来,最后赋值给res1和res2:
def compute_add(_x, _y): return _x * _y + 10 def compute_sub(_x, _y): return _x * _y - 10 list1 = [1, 2, 3, 4, 5] list2 = [10, 20, 30, 40, 50] # 生成临时元组列表并解包 temp = [(compute_add(x, y), compute_sub(x, y)) for x, y in zip(list1, list2)] res1, res2 = zip(*temp) # 如果你需要列表类型(zip返回的是元组),可以转换一下 res1 = list(res1) res2 = list(res2) print(res1) # 输出: [20, 50, 100, 170, 260] print(res2) # 输出: [0, 30, 80, 150, 240]
方法2:单循环直接追加(更直观)
如果追求可读性,直接用一次for循环遍历zip后的元素,同时往两个结果列表里追加值,代码逻辑更清晰:
def compute_add(_x, _y): return _x * _y + 10 def compute_sub(_x, _y): return _x * _y - 10 list1 = [1, 2, 3, 4, 5] list2 = [10, 20, 30, 40, 50] res1 = [] res2 = [] for x, y in zip(list1, list2): res1.append(compute_add(x, y)) res2.append(compute_sub(x, y)) print(res1) # 输出: [20, 50, 100, 170, 260] print(res2) # 输出: [0, 30, 80, 150, 240]
为什么原来的代码报错?
你写的res1, res2 = [compute_add(x, y), compute_sub(x, y) for x, y in zip(list1, list2)]会生成一个长度为5的列表,每个元素是单个的计算结果(比如第一个元素是compute_add(1,10)的结果,第二个是compute_sub(2,20)的结果……),这时候试图把5个元素的列表赋值给两个变量,Python会抛出ValueError: too many values to unpack (expected 2),因为数量不匹配。
内容的提问来源于stack exchange,提问作者User




