返回多个列表的 Python 列表理解

标签 python list-comprehension

我不知道这在 Python 中是否可行,这就是我在这里问它的原因。

我有一个返回元组的 Python 函数:

def my_func(i):
    return i * 2, 'a' * i

这只是一个给定数字k的哑函数,它按原样返回k * 2,另一个字符串是字母'a'连接的k 次。

我现在想形成两个列表,用 i = 0...9 调用函数,我想创建一个包含所有第一个值的列表和另一个包含其余值的列表。

我目前的知识是:

选项 1: 运行相同的列表推导两次,效率不高:

first_vals = [my_func(i)[0] for i in range(10)]
second_vals = [my_func(i)[1] for i in range(10)]

选项 2: 避免列表推导:

first_vals = []
second_vals = []
for i in range(10):
    f, s = my_func(i)
    first_vals.append(f)
    second_vals.append(s)

选项 3: 使用列表推导获取元组列表,然后使用其他两个列表推导来复制值。它比 Option 1 更好,因为这里 my_func() 只为每个 i 调用一次:

ret = [my_func(i) for i in range(10)]
first_vals = [r[0] for r in ret]
second_vals = [r[1] for r in ret]

是否有可能以某种方式使用列表理解功能,以便在一个命令和一次迭代中返回两个列表,将每个返回的参数分配到不同的列表中?

最佳答案

选项 4:使用 zip 的逆函数:

first_vals, second_vals = zip(*[my_func(i) for i in range(10)])

作为Mark Dickinson在评论中指出,这将导致 first_valssecond_vals 的元组。例如,如果您需要它们是 list 类型,您可以应用 map:

first_vals, second_vals = map(list, zip(*[my_func(i) for i in range(10)]))

关于返回多个列表的 Python 列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241302/

相关文章:

python - 使用 YouTube Python API 禁用评论/评分?

python - 在搜索指南针方向时,我可以忽略 python 中的零长度正则表达式匹配吗?

Python 列表理解与求和

haskell - 综合领悟的现状如何?

python - 初学者Python : Accumulator loop function

python - 从 Boto3 响应指令中获取值的优雅方式

python - 如何在Python中将一行中的数字读入变量和元组

python - 理解在字典中找到最小值

python - 从 NLTK for Python 中的同义词集列表中提取单词

Python:将列表链接在一起