在 Python 中索引 2d 列表:每个维度的长度不是我所期望的

Indexing 2d lists in Python: Lengths in each dimension are not what I expect

如果我创建一个二维列表:

In [1]: foo = [[None]*10]*5

In [2]: foo
Out[2]: 
[[None, None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None, None],
 [None, None, None, None, None, None, None, None, None, None]]

In [3]: len(foo)
Out[3]: 5

我希望 foo 的第一个元素中的列表可以用 foo[0]foo[0][:] 访问。因此它的长度是 10,如预期的那样:

In [4]: len(foo[0][:])
Out[4]: 10

type(foo[:][0]) returns“列表”。我希望这是一个由 foo 的每个“子列表”中的第 0 个元素构成的列表。因此它的长度应该是 5。然而,事实并非如此:

In [5]: len(foo[:][0])
Out[5]: 10

我在这里遗漏了什么/我不明白什么?

列表的列表不是矩阵,它是……列表的列表。

我们分解一下foo[:][0]

  • foo 是一个指向列表的名字
  • [:] 是对 foo 指向的列表的第一个“下标访问”。具体来说,您将通过在没有给定索引的情况下对其进行切片来获取原始列表的副本
  • [0]是对第一个结果的第二次“下标访问”。

您正在访问 foo 副本的第一个元素。

列表代码源码中,List是一个双指针结构,指向数组space,长度为list.To你的列表foo[:][0] , foo[:] 可以这样写 foo[start:end], 而且, 如果你没有设置开始和结束的值, 它会自动设置 -infinf.So,foo[ :] 拥有所有 sub_List.foo[:][0] 是您的 sub_List.

之一

尝试将数组转换为 numpy,它工作得更快,并且在访问元素时更方便。

import numpy as np
foo = np.array([[None]*10]*5)
print(foo.shape)
print(len(foo[0, :]))#10
print(len(foo[:, 0]))#5