我有一个表单列表:
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]
答案 0 :(得分:10)
通过执行x = y = []
,您正在创建x
和y
并将它们引用到同一列表中,从而导致错误的输出。 (对象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)
P.S。 - 请不要将list
用作变量名称,它会遮挡内置颜色。
答案 1 :(得分:4)
当您说x = y = []
时,您导致x
和y
成为对相同列表的引用。因此,当您编辑其中一个时,您可以编辑另一个。关于引用如何工作,有一个很好的解释here。
因此,如果您改为
,则可以使用您的代码x = []; y = []
您也可以尝试zip
:
lst = [[3, 1], [3, 2], [3, 3]]
x,y = zip(*lst)
正如Sukrit所说,不要将list
用作变量名(或int
或str
或者你有什么),因为它虽然是Python内置的(加载)解释器并键入help(list)
- 事实上弹出的东西意味着Python预先定义了list
来表示某些东西)Python会高兴地让你重新定义(也就是阴影)它。这可能会在以后破坏您的代码。
答案 2 :(得分:2)
那是因为当你像x = y = []
那样构造x和y时,x和y指向同一个列表。如果要将它们设为不同的列表,则应将它们声明为
x = []
y = []
答案 3 :(得分:1)
您正在设置x = y = []
意味着x指向指向列表的y,因此无论何时附加到其中,您都会附加到另一个。将代码更改为以下内容:
x = []
y = []
for sublist in list:
x.append(sublist[0])
y.append(sublist[1])
答案 4 :(得分:0)
你可以这样做:
x = [i[0] for i in list]
y = [i[1] for i in list]