如何使用list comprehention等于python中的多个变量?

Ant*_*ton 1 python list-comprehension

假设我有以下项目

_example = namedtuple('example',['x','y'])
Run Code Online (Sandbox Code Playgroud)

我收集了一堆这样的例子

examples = magic_function_that_returns_a_list_of_examples()
Run Code Online (Sandbox Code Playgroud)

我想替换以下2行

xs = [ e.x for e in examples]
ys = [ e.y for e in examples]
Run Code Online (Sandbox Code Playgroud)

对于某些事情......

xs,ys  = [ [e.x,e.y] for e in examples]
Run Code Online (Sandbox Code Playgroud)

换句话说,是否有可能利用列表推导来一次设置两个变量?

iz_*_*iz_ 5

您只需转置namedtuples 列表并将其解压缩:

xs, ys = zip(*examples)
Run Code Online (Sandbox Code Playgroud)

例如:

from collections import namedtuple

example = namedtuple('example',['x','y'])
examples = [example(i, j) for i in range(5) for j in range(5)]

xs, ys = zip(*examples)
print(xs)
print(ys)
Run Code Online (Sandbox Code Playgroud)

输出:

(0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4)
(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

任何具有列表推导的解决方案都会被不必要地复杂化,最好用你给出的两个列表推导来代替.如果你想在一行中完成,那么列表推导的最清晰,最易读的方法是

xs, ys = [e.x for e in examples], [e.y for e in examples]
Run Code Online (Sandbox Code Playgroud)

但是,zip(*examples)在我看来,可能还是更好.

  • `xs,ys = zip(*[[ex,ey] for e in examples])`,可能这可能是单行解决方案之一 (2认同)
  • @AI_Learning是的,我想到了,但我意识到这与`zip(*examples)`完全一样...... (2认同)