You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何单次遍历Python zip列表,将双函数结果分别存入不同列表?

解决方案:一次性遍历生成两个结果列表

你的思路没问题,但原来的列表推导式写法不符合Python的赋值规则——它会生成一个包含元组的列表,没法直接拆成两个单独的结果列表。这里有两种可行的实现方式:

方法1:列表推导式 + zip(*...)解包

利用列表推导式先生成每个元素为(加法结果, 减法结果)的临时列表,再通过zip(*...)把所有加法结果和减法结果分别聚合起来,最后赋值给res1res2

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

火山引擎 最新活动