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

时间:2017-02-21 19:25:33

标签: python python-3.x list-comprehension

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

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个总体理解。但我想知道是否有一种干净的方式来做单一列表理解。

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

6 个答案:

答案 0 :(得分:12)

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

[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]

(注意range从0开始计数

替代:另一种方法是:

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

但这当然 ,而且效率低下(给定f计算成本高昂。)

答案 1 :(得分: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))

答案 2 :(得分:5)

让我们开展这项工作。功能很好:

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

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

x = range(1, 4)

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

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

现在结果如预期:

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

答案 3 :(得分:3)

使用

zip(*your_list_of_bituples)

实施例

demo_list = [(1, 2), (2, 3), (4, 5)]
zip(*demo_list)

会给出

[(1, 2, 4), (2, 3, 5)]

答案 4 :(得分:0)

我知道已经很晚了,但是以下内容可以满足您的需求。

def f(value):
    xlist = []
    ylist = []
    for x, y in [(2*x, x*x) for x in range(value)]:
        xlist.append(x)
        ylist.append(y)
    return xlist, ylist

x = int(input("enter a value: "))
xval, yval = f(x)

print(f"xlist = {xval}\nylist = {yval}")

答案 5 :(得分:0)

def f(x):
    yield [2*x, x*x]
        
xlist, ylist = zip(*[next(f(x)) for x in range(3)])

print(list(xlist))
print(list(ylist))

使用收益...

[0, 2, 4]
[0, 1, 4]

[Program finished]