我不知道这在 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_vals
和 second_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/