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

Agv*_*uva 0 python list-comprehension

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

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

def my_func(i):
    return i * 2, 'a' * i
Run Code Online (Sandbox Code Playgroud)

这只是一个给定数字的哑函数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)]
Run Code Online (Sandbox Code Playgroud)

选项2:避免列表理解:

first_vals = []
second_vals = []
for i in range(10):
    f, s = my_func(i)
    first_vals.append(f)
    second_vals.append(s)
Run Code Online (Sandbox Code Playgroud)

选项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]
Run Code Online (Sandbox Code Playgroud)

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

NKa*_*hle 6

选项4:使用以下项的反函数zip

first_vals, second_vals = zip(*[my_func(i) for i in range(10)])
Run Code Online (Sandbox Code Playgroud)

正如马克·迪金森在评论中指出,这将导致元组first_valssecond_vals。如果您需要它们属于list某种类型,则可以应用例如map

first_vals, second_vals = map(list, zip(*[my_func(i) for i in range(10)]))
Run Code Online (Sandbox Code Playgroud)

  • @PatrickArtner 1.您未定义`zipped_list`。2.如果您的评论应该作为答案,则应将其发布为一个。 (2认同)