【问题标题】:python populating array using while looppython使用while循环填充数组
【发布时间】:2020-02-16 07:44:02
【问题描述】:

我要做的就是按顺序用数字填充数组。所以,array[0][0] = 0,array[0][1]=1 等等。为什么这不起作用?我想不通。

def populateArray(ar):
    count = 0
    i=0
    j=0
    while (i<len(ar)):
        while (j<len(ar[i])):
            ar[i][j] = count
            count = count + 1
            j=j+1
        j=0
        i=i+1
    return ar

numColumns = input('how many columns?')
numRows = input('how many rows?')
arr = [[0]*int(numColumns)]*int(numRows)
arr=populateArray(arr)
print(arr)

【问题讨论】:

  • 如何这是“不工作”?这是重要信息,应该成为您问题的一部分。

标签: python arrays loops while-loop


【解决方案1】:

当您启动 arr 变量时,您将列表列表与数字相乘,这会导致“混乱”,因为您实际上所做的只是将第一个列表的引用相乘(来自您的列表列表),所以实际上你在你的arr 只有一个列表和一堆对该列表的引用,要解决这个问题,你可以这样做:

arr = [[0] * int(numColumns) for _ in range(int(numRows))]

或:

arr = [[0 for _ in range(int(numColumns))] for _ in range(int(numRows))]

在您的代码中更改此内容后,对于 numRows = 3 和 numColumns = 4,您会得到:

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

【讨论】:

  • 感谢您提供的信息,这正是我需要知道的。所以问题不是while循环,而是我如何初始化我的数组(arr变量)。非常感谢。
【解决方案2】:

当你使用这种语法创建多维数组时

arr = [[0]*int(numColumns)]*int(numRows)

同一个元素的引用被创建了很多次,所以如果你给其中一个赋值,那么你基本上是在改变所有的元素,因为它们都引用了相同的数据。 例如:

arr = [[0]*int(numColumns)]*int(numRows)
arr[0][1]=2
print(arr)

输出

[[0, 2], [0, 2], [0, 2], [0, 2]]

我只改变了一个元素,结果就是这样。 你应该使用:

arr = [[0 for i in range(int(numColumns))] for j in range(int(numRows))]
arr[0][1]=2
print(arr)

输出:

[[0, 2], [0, 0], [0, 0], [0, 0]]

【讨论】:

    【解决方案3】:

    你可以这样做:

    numColumns = input('how many columns?') 
    numRows = input('how many rows?') 
    arr = [[i+j for i in range(int(numRows))] for j in range(int(numColumns))] 
    arr=populateArray(arr) 
    print(arr)
    

    您的代码的问题是您将同一个数组多次附加到主数组,例如 [l, l, l] 和 l 是一个列表。

    因此,当您更改 l 的元素时,它会更改列表中的所有 ls。

    因此,您的代码可以正常工作,但是每次您更改另一个列表时,之前的所有列表都会受到影响。

    【讨论】:

      【解决方案4】:

      您也可以使用numpy 创建结构,然后使用numpy.tolist() 将其转换为python 列表

      import numpy as np
      numColumns = int(input('how many columns?')) 
      numRows = int(input('how many rows?') )
      arr = np.arange(numRows*numColumns).reshape(numRows, numColumns).tolist()
      print(arr)
      

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 2011-10-08
        • 1970-01-01
        • 2017-07-15
        • 1970-01-01
        • 2023-01-20
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多