5

我有一个表格列表:

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]
4

5 回答 5

11

通过这样做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)

PS - 请不要list用作变量名,它会影响内置函数。

于 2013-07-22T19:18:57.260 回答
4

当您说 时x = y = [],您正在导致xy成为对同一列表的引用。所以当你编辑一个时,你编辑另一个。这里有一个关于引用如何工作的很好的解释。

因此,如果您说,您可以使用您的代码

x = []; y = []

您可能还想尝试zip

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

正如 Sukrit 所说,不要list用作变量名(或intstr或你有什么),因为尽管它是 Python 内置的(加载解释器和类型help(list)- 弹出的事实意味着 Python 已经预定义list意味着什么)Python 会很高兴地让你重新定义(又名影子)它。这可能会在以后破坏您的代码。

于 2013-07-22T19:18:00.337 回答
2

那是因为当你像这样构造 x 和 y 时,x = y = []x 和 y 指向同一个列表。如果你想让它们成为不同的列表,你应该像这样声明它们

x = []
y = []
于 2013-07-22T19:19:19.183 回答
1

您正在设置x = y = []含义 x 指向 y ,它指向列表,因此每当您附加到一个时,您就附加到另一个。将代码更改为如下所示:

x = [] 
y = []
for sublist in list:
    x.append(sublist[0])
    y.append(sublist[1])
于 2013-07-22T19:19:35.397 回答
0

你可以做:

x = [i[0] for i in list]
y = [i[1] for i in list]
于 2013-07-22T19:25:31.923 回答