Python 解压列表中的值

Python 解压列表中的值,python,Python,我想做以下工作: A, B = [[x, y] for (x, y) in Z] 期望输出: A = [x1, x2, ...] # xN are the N x values in Z B = [y1, y2, ...] 有一个显而易见的解决方案: A, B = [x for (x, y) in Z], [y for (x, y) in Z] 但是实际的代码有一个相当大的列表,其中包含一些条件,因此应该保持这种方式,不仅可以保存代码行(和性能!),而且还可以实现所需的程序行为(实际的当前

我想做以下工作:

A, B = [[x, y] for (x, y) in Z]
期望输出:

A = [x1, x2, ...] # xN are the N x values in Z
B = [y1, y2, ...]
有一个显而易见的解决方案:

A, B = [x for (x, y) in Z], [y for (x, y) in Z]

但是实际的代码有一个相当大的列表,其中包含一些条件,因此应该保持这种方式,不仅可以保存代码行(和性能!),而且还可以实现所需的程序行为(实际的当前代码只检索Z中(x,y)的
x,并将其分配给
a
).

如果您说存在多个可能复杂的条件,请记住使用for循环可能更适合

A = []
B = []
for x, y in Z:
    if conditon_on_x:
        A.append(x)
    if condition_on_y:
        B.append(y)
应该有用。根据Z的类型,您可能会侥幸逃脱:

A, B = zip(*Z)

您可以使用zip解压,方法是展开变量,如zip(*var):

这是因为zip(*元组列表)被扩展为zip(('a',0),('b',1),('c',2),('d',3),('e',4)),zip将所有这些元组压缩在一起,产生了一个解压,这很讽刺


但我不认为用单一的列表理解来做这件事实际上是可能的,对不起

在我的回答中,这最好写为
A,B=zip(*Z)
@lvc,OP提到他们的列表理解比显示的条件更多,因此是更长的版本。非常好!但正如我所说,在列表理解中有多个条件,它们被仔细地放置,只有在必要时才被评估,所以我仍然需要提到x和y。当Z为空时,这是失败的。wowserx的答案也起作用,并且允许我满足问题的约束条件:)另一个答案实际上与我的答案相同。我刚才解释了它是如何工作的。在我的例子中,
x,y
Z
是密切相关的,因此代码的用途很容易理解。虽然有时短代码并不是最合适的,但这是事实。对不起,我在重读他的答案后编辑了我的评论。wowserx的one liner只是构造列表,而不是使用变量,但解压方法是相同的。
A, B = zip(*Z)
>>> list_of_tuples = [('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)]
>>> alpha, num = zip(*list_of_tuples)
>>> print(alpha)
('a', 'b', 'c', 'd', 'e')
>>> print(num)
(0, 1, 2, 3, 4)