列表理解为多个返回函数?

Chr*_*phe 12 python list-comprehension python-3.x

我有一个返回两个值的函数,我想使用列表推导来填充两个列表.例如:

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]))
Run Code Online (Sandbox Code Playgroud)

预期回报应该是:

xlist = [0, 2, 4]
ylist = [0, 1, 4]
Run Code Online (Sandbox Code Playgroud)

我的问题归结为:

目前我得到了一个元组列表,虽然这是合理的,但我最终需要两个独立的列表.目前我可以有1个占位符(元组列表)变量和3个总体理解.但我想知道是否有一种干净的方式来做单列表理解.

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

Wil*_*sem 17

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

[f(value) for value in x]
#  ^ notice the `value`
Run Code Online (Sandbox Code Playgroud)

代替:

[f(x) for value in x]
Run Code Online (Sandbox Code Playgroud)

此外,重点是:

return 2*x,x
Run Code Online (Sandbox Code Playgroud)

是短的:

return (2*x,x)
Run Code Online (Sandbox Code Playgroud)

所以一个元组.因此,列表推导会生成元组列表,而不是列表元组.zip然而,好处是你可以轻松地使用它与星号相反:

xlist,ylist = zip(*[f(value) for value in x])
#                 ^ with asterisk
Run Code Online (Sandbox Code Playgroud)

请注意,xlist并且ylist将是元组(因为zip将被解压缩).如果您希望它们成为列表,您可以使用:

xlist,ylist = map(list,zip(*[f(value) for value in x]))
Run Code Online (Sandbox Code Playgroud)

这导致:

>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]
Run Code Online (Sandbox Code Playgroud)

(注意ranges从0开始计数)

替代方案:另一种方法是:

xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]
Run Code Online (Sandbox Code Playgroud)

但这当然是不优雅的,而且效率低(给定f计算成本高).


Spa*_*ine 5

使用内置函数zip(),

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))
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 5

让我们做这个工作吧.功能很好:

def f(x):
  return 2*x, x*x
Run Code Online (Sandbox Code Playgroud)

但是你想要如下定义范围,注意起始值和结束值:

x = range(1, 4)
Run Code Online (Sandbox Code Playgroud)

此外,您必须使用调用该函数,而不是使用列表作为参数.将结果解压缩到两个列表的最后一个技巧就是简单地列出清单zip(*lst)的结果:

xlist, ylist = zip(*[f(value) for value in x])
Run Code Online (Sandbox Code Playgroud)

现在结果如预期:

xlist 
=> [2, 4, 6]
ylist 
=> [1, 4, 9]
Run Code Online (Sandbox Code Playgroud)