假设我有以下代码:
def f(x):
return 2*x,x*x
x = range(3)
xlist, ylist = [f(value) for value in x]
我怎样才能干净利落地得到这样的结果呢?
xlist = [0, 2, 4]
ylist = [0, 1, 4]
发布于 2017-02-21 19:28:16
注意,return 2*x,x
是return (2*x,x)
的缩写,即a tuple。因此,生成一个元组的列表,而不是列表的元组。然而,zip
的好处是,可以轻松地用星号在反向中使用它:
xlist,ylist = zip(*[f(value) for value in x])
# ^ with asterisk
注意,xlist
和ylist
将是元组(因为zip
将被解压缩)。如果您希望它们成为列表,您可以使用:
xlist,ylist = map(list, zip(*[f(value) for value in x]))
其结果是:
>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]
另一种方法是使用单独的清单理解:
xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]
当然,这重复了f
的工作,这是不优雅的,而且效率很低。
发布于 2017-02-21 19:30:21
让我们把这事做好。功能很好:
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]
发布于 2017-02-21 19:30:11
使用内置函数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))
https://stackoverflow.com/questions/42376201
复制相似问题