我有一个返回两个值的函数,我想使用列表理解来填充两个列表。 例如:
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个总理解。但我想知道是否有一个干净的方法来做它作为单一的清单理解。
值得注意的是:在实际代码中,我的两个返回是相关的,因此我不能简单地将函数分成两个。
让我们来做这个。功能很好:
但要按如下方式定义范围,请注意起始值和结束值:
此外,必须使用值调用函数,而不是使用列表作为参数。最后一个将结果解压成两个列表的技巧是简单地
zip(*lst)
列表理解的结果:现在结果如预期:
首先,你犯了一个小错误:应该是:
而不是:
此外,重点是:
简称:
所以一个元组。因此,您的列表理解会生成一个元组列表,而不是一个列表元组。但是
zip
的好处是,您可以很容易地将它与星号反向使用:注意
xlist
和ylist
将是元组(因为zip
将被解包)。如果希望它们是列表,例如,可以使用:结果是:
(注意
range
s从0开始计数)替代方法:另一种方法当然是:
但这当然是不雅的而且可能是低效的(因为
f
在计算上是昂贵的)。使用内置函数^{}
相关问题 更多 >
编程相关推荐