2013-07-22 38 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]