我不知道在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:使用列表推导来获取元组列表,然后使用另外两个列表推导来复制值。它优于 选项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]
是否有可能以某种方式使用列表推导功能,以便在一个命令和一个迭代中返回两个列表,将每个返回的参数分配到不同的列表中?
答案 0 :(得分:5)
选项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)]))