多重返回函数的列表理解?

2024-06-25 08:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个返回两个值的函数,我想使用列表理解来填充两个列表。 例如:

def f(x):
  return 2*x,x*x

x = range(3)
xlist, ylist = [f(value) for value in x]

EDITS from answers below:
xtuple, ytuple = zip(*[f(value) for value in x])
xlist, ylist = map(list,zip(*[f(value) for value in x]))

预期回报应为:

xlist = [0, 2, 4]
ylist = [0, 1, 4]

我的问题归结为:

目前我得到一个元组列表,虽然这是合理的,但我将需要两个独立的列表。目前,我可以有1个占位符(元组列表)变量和3个总理解。但我想知道是否有一个干净的方法来做它作为单一的清单理解。

值得注意的是:在实际代码中,我的两个返回是相关的,因此我不能简单地将函数分成两个。


Tags: 函数infrom列表forreturnvaluedef
3条回答

让我们来做这个。功能很好:

def f(x):
  return 2*x, x*x

但要按如下方式定义范围,请注意起始值和结束值:

x = range(1, 4)

此外,必须使用调用函数,而不是使用列表作为参数。最后一个将结果解压成两个列表的技巧是简单地zip(*lst)列表理解的结果:

xlist, ylist = zip(*[f(value) for value in x])

现在结果如预期:

xlist 
=> [2, 4, 6]
ylist 
=> [1, 4, 9]

首先,你犯了一个小错误:应该是:

[f(value) for value in x]
#  ^ notice the `value`

而不是:

[f(x) for value in x]

此外,重点是:

return 2*x,x

简称:

return (2*x,x)

所以一个元组。因此,您的列表理解会生成一个元组列表,而不是一个列表元组。但是zip的好处是,您可以很容易地将它与星号反向使用:

xlist,ylist = zip(*[f(value) for value in x])
#                 ^ with asterisk

注意xlistylist将是元组(因为zip将被解包)。如果希望它们是列表,例如,可以使用:

xlist,ylist = map(list,zip(*[f(value) for value in x]))

结果是:

>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]

(注意ranges从0开始计数)

替代方法:另一种方法当然是:

xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]

但这当然是不雅的而且可能是低效的(因为f在计算上是昂贵的)。

使用内置函数^{}

def f(x):
  return 2*x, x*x

x = range(1, 4)
xlist, ylist = zip(*[f(value) for value in x])

print(xlist, ylist)
# ((2, 4, 6), (1, 4, 9))

相关问题 更多 >