如何从列表理解中获取多个列表作为单独的结果?

新手上路,请多包涵

假设我有这段代码:

 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]

原文由 Christophe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
2 个回答

注意 return 2*x,xreturn (2*x,x) 的缩写,即 元组。因此,您的列表理解 会生成一个 list of tuples ,而不是一个 tuple of lists 。 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]

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

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

当然,这会重复 f 的工作,这是不优雅且效率低下的。

原文由 Willem Van Onsem 发布,翻译遵循 CC BY-SA 4.0 许可协议

让我们完成这项工作。功能很好:

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

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

 x = range(1, 4)

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

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

现在结果符合预期:

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

原文由 Óscar López 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题