【问题标题】:How to make two-dimensional list in Python (without numpy)? [duplicate]如何在 Python 中制作二维列表(没有 numpy)? [复制]
【发布时间】:2018-01-01 03:23:03
【问题描述】:

这可能是重复的问题,但我仍然对此感到好奇。

我想在没有 numpy 的 Python 中制作二维列表。所以我列出了一份清单。这是我的代码:

myList = [None] * 3
print('myList :', myList)
myMatrix = [myList] * 3
#myMatrix = [[None, None, None], [None, None, None], [None, None, None]]
print('myMatrix', myMatrix)
for i in range (0,3):
    for j in range (0, 3):
        myMatrix[i][j] = i+j
    print('myMatrix[',i,'] : ', myMatrix[i])

print(myMatrix)
print(myMatrix[0])
print(myMatrix[1])
print(myMatrix[2])

我知道声明:

myMatrix = [myList] * 3

使代码无法按预期工作,这是因为 list 是可变对象,这意味着 myMatrix[0]、myMatrix[1]、myMatrix[2] 将引用同一个对象。更改其中任何一个都意味着更改所有这些,这不是我在代码中所期望的。这是我的代码的意外输出:

('myList :', [None, None, None])
('myMatrix', [[None, None, None], [None, None, None], [None, None, None]])
('myMatrix[', 0, '] : ', [0, 1, 2])
('myMatrix[', 1, '] : ', [1, 2, 3])
('myMatrix[', 2, '] : ', [2, 3, 4])
[[2, 3, 4], [2, 3, 4], [2, 3, 4]]
[2, 3, 4]
[2, 3, 4]
[2, 3, 4]

我找到的唯一解决方案是,与其说 myMatrix = [myList] * 3,不如写成:

myMatrix = [[None, None, None], [None, None, None], [None, None, None]]

这将使代码按我预期的方式在下面工作(程序的输出):

('myMatrix', [[None, None, None], [None, None, None], [None, None, None]])
('myMatrix[', 0, '] : ', [0, 1, 2])
('myMatrix[', 1, '] : ', [1, 2, 3])
('myMatrix[', 2, '] : ', [2, 3, 4])
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]

但这不是定义 NxN 矩阵的有效方法,尤其是当 N 是一个很大的数字时。

Python 是否有一种使用列表列表定义 NxN 矩阵的有效方法?

我对 C/C++ 比较熟悉,所以这个问题确实困扰着我。一些答案会推荐我使用 numpy,但此时我想从头开始学习基本的 Python(不导入任何库)。当我使用 C/C++ 时,我可以轻松地使用这个二维数组,而无需导入任何库。当我刚接触 Python 时要求我使用 numpy,就像我刚接触 C 时要求我使用 STL。

当然我以后会学习 numpy,但我想先不使用 numpy 来解决这个问题。

【问题讨论】:

标签: python list matrix mutable


【解决方案1】:

最直接的构建方式是这样的:

list_of_lists = []
for row in range(rows):
    inner_list = []
    for col in range(cols):
        inner_list.append(None)
    list_of_lists.append(inner_list)

或使用列表理解:

list_of_lists = [[None for col in range(cols)] for row in range(rows)]

这两种方式是等价的。

【讨论】:

    【解决方案2】:

    要创建最初用None 填充的myList,您可以这样做:

    N = 3
    myList = [[None] * N for i in range(N)]
    
    print(myList)
    

    这给出了:

    [[None, None, None], [None, None, None], [None, None, None]
    

    然后如果要更新每个单元格,只需遍历行和列,其中row 是矩阵中行的索引,col 是矩阵中列的索引。然后您可以相应地更新每个my_List[row][col] 单元格:

    for row in range(N):
        for col in range(N):
            myList[row][col] = row + col
    
    print(myList)
    

    哪些输出:

    [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 2017-12-06
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多