首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得多个列表作为列表理解的独立结果?

如何获得多个列表作为列表理解的独立结果?
EN

Stack Overflow用户
提问于 2017-02-21 19:25:33
回答 6查看 20.9K关注 0票数 23

假设我有以下代码:

代码语言:javascript
运行
复制
def f(x):
    return 2*x,x*x

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

我怎样才能干净利落地得到这样的结果呢?

代码语言:javascript
运行
复制
xlist = [0, 2, 4]
ylist = [0, 1, 4]
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-21 19:28:16

注意,return 2*x,xreturn (2*x,x)的缩写,即a tuple。因此,生成一个元组的列表,而不是列表的元组。然而,zip的好处是,可以轻松地用星号在反向中使用它:

代码语言:javascript
运行
复制
xlist,ylist = zip(*[f(value) for value in x])
#                 ^ with asterisk

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

代码语言:javascript
运行
复制
xlist,ylist = map(list, zip(*[f(value) for value in x]))

其结果是:

代码语言:javascript
运行
复制
>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]

另一种方法是使用单独的清单理解:

代码语言:javascript
运行
复制
xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]

当然,这重复了f的工作,这是不优雅的,而且效率很低。

票数 34
EN

Stack Overflow用户

发布于 2017-02-21 19:30:21

让我们把这事做好。功能很好:

代码语言:javascript
运行
复制
def f(x):
  return 2*x, x*x

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

代码语言:javascript
运行
复制
x = range(1, 4)

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

代码语言:javascript
运行
复制
xlist, ylist = zip(*[f(value) for value in x])

现在的结果与预期的一样:

代码语言:javascript
运行
复制
xlist 
=> [2, 4, 6]
ylist 
=> [1, 4, 9]
票数 7
EN

Stack Overflow用户

发布于 2017-02-21 19:30:11

使用内置函数zip()

代码语言:javascript
运行
复制
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))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42376201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档