返回多个列表的Python列表推导

时间:2018-01-13 15:26:47

标签: 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:使用列表推导来获取元组列表,然后使用另外两个列表推导来复制值。它优于 选项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]

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

1 个答案:

答案 0 :(得分:5)

选项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)]))