我有一个返回两个值的函数,我想使用列表理解来填充两个列表.

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个总理解.但我想知道是否有一个干净的方法来做这件事,作为单一列表理解.

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

推荐答案

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

[f(value) for value in x]
#  ^ notice the `value`

而不是:

[f(x) for value in x]

此外,重点是:

return 2*x,x

缩写为:

return (2*x,x)

所以a tuple.你的列表不是列表的元组.带星号的zipis that you can easily use it in reverse是件好事:

xlist,ylist = zip(*[f(value) for value in x])
#                 ^ with asterisk

注意,xlistylist将是tuples(因为zip将被解包).如果希望它们成为列表,可以使用:

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

其结果是:

>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]

(请注意,range从0开始计数)

Alternative:另一种方法当然是:

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

但这当然是inelegantly,而且效率可能很低(给定f在计算上很昂贵).

Python-3.x相关问答推荐

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

DuckDB:带有嵌套对象的星形表达式

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

安装grpcio时出现错误DeproationWarning:pkg_resource

Numba编译时间呈指数级增长--可以像C编译器一样配置优化级别吗?

PYSMB中的进度条

从PYTHON中获取单行和多行的Rguar表达式

基于Pandas列动态创建分箱,以使观测值数量或计数占总计数的1%.

将值从函数传递到标签

嵌套协议的使用(协议成员也是协议)

类不继承时 super() 的用途

Pandas 在每组两个条件之间获得时间增量

如何在 Python 3 中通过 IP 获取 WhoIs 信息?

全局捕获快速 api 中的异常

创建日志(log)文件

使用 Python3 与 HDFS 交互的最佳模块是什么?

如何使用 Python 订阅 Websocket API 通道?

从 csv 中删除单行而不复制文件

有没有一种标准方法来确保 python 脚本将由 python2 而不是 python3 解释?

print(... sep='', '\t' ) 是什么意思?