2013-07-22 36 views
5

我有一個列表的列表形式:如何追加子列表的元素在python

list = [[3, 1], [3, 2], [3, 3]] 

而且我想把它分成兩個列表,每個子表和一個的x值用每個子列表的y值。

目前,我有這樣的:

x = y = [] 
for sublist in list: 
    x.append(sublist[0]) 
    y.append(sublist[1]) 

但返回這一點,我不知道爲什麼:

x = [3, 1, 3, 2, 3, 3] 
y = [3, 1, 3, 2, 3, 3] 

回答

10

通過做x = y = []您正在創建xy並將它們引用到相同的列表,因此錯誤的輸出。 (對象ID在下面相同)

>>> x = y = [] 
>>> id(x) 
43842656 
>>> id(y) 
43842656 

如果解決該問題,則會得到正確的結果。

>>> x = [] 
>>> y = [] 
>>> for sublist in lst: 
     x.append(sublist[0]) 
     y.append(sublist[1]) 


>>> x 
[3, 3, 3] 
>>> y 
[1, 2, 3] 

雖然,這可能作出這樣做很容易。

x,y = zip(*lst)

附: - 請不要使用list作爲變量名稱,它會影響內置。

+4

不錯的使用id'的'。和關於'list'的好點。 –

+1

'zip'解決方案非常整齊。 –

4

當你說x = y = [],你造成xy是參考相同的列表。所以,當你編輯一個,你編輯另一個。關於參考如何工作有一個很好的解釋here

因此,如果你說你可以用你的代碼,而不是

x = []; y = [] 

您也可能想嘗試zip

lst = [[3, 1], [3, 2], [3, 3]] 
x,y = zip(*lst) 

而作爲Sukrit說,不要使用list作爲變量名(或者intstr或你有什麼),因爲它是一個內置的Python(加載一個解釋器並輸入help(list) - 事實彈出意味着Python已經預先定義list意味着什麼)Python會高興地讓你重新定義(a.k.a.影子)它。以後可能會破壞你的代碼。

2

這是因爲當你構造x和y像x = y = []那麼x和y指向相同的列表。如果你想使他們不同的列表,你應該像

x = [] 
y = [] 
1

宣佈他們正在設置x = y = []含義X指向它指向列表Ÿ所以每當你追加到,您會被附加到其他。更改代碼是這樣的:

x = [] 
y = [] 
for sublist in list: 
    x.append(sublist[0]) 
    y.append(sublist[1]) 
0

你可以這樣做:

x = [i[0] for i in list] 
y = [i[1] for i in list]