2016-03-01 29 views
7

在Python中有什麼方法可以從理解中返回多個列表?從python中的理解返回多個列表

我想要做的東西的影響:

x,y = [i,(-1*j) for (i,j) in enumerate(range(10))] 
# x = [0 .. 9] 
# y = [0 .. -9] 

這是一個愚蠢的例子,但我只是想知道,如果這是可能的。

+0

也許,但我不能想想爲什麼你會想要的實際原因。 – IanAuld

+1

@IanAuld你不能看到想要分開你的X和Y的實際理由? (也許是在某些圖書館中繪圖?) –

+0

它可能會更具可讀性並且更易於維護。沒有必要把所有東西都放在一條線上。 – IanAuld

回答

2
x,y =zip(* [(i,(-1*j)) for (i,j) in enumerate(range(10))]) 

你只需要解壓縮列表

xy = [(1,2),(3,4),(5,6)] 
x,y = zip(*xy) 
# x = (1,3,5) 
# y = (2,4,6) 
+2

這兩個元素的返回類型都是元組而不是列表 – IanAuld

+1

它會給出元組而不是列表,但它是正確的想法 – wim

+1

Sort。一個主要的區別是可變的!=不可變的。 – IanAuld

1

可以跳過列表理解:

>>> x,y=range(0,10), range(0,-10,-1) 
>>> x 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> y 
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 

或者你可以這樣做:

>>> x,y=map(list, zip(*[(e,-e) for e in range(10)])) 
+0

注意:'range'只返回Py2上的'list';在Py3上,它是一個特殊的'range'對象,它需要被包裝在'list'構造函數中以創建一個實際的,可變的'list'。但是,是的,如果問題與給定的一樣簡單,那麼最好避免生成配對值的複雜性,並在更容易直接生成非配對值時解除配對。如果不需要可變性,使用原始的Py3'range'通常會比可變的'list'好(即使你不需要可變性,Py2'xrange'也不如直接替換的好) )。 – ShadowRanger