python заполнение массива с использованием цикла while - PullRequest
0 голосов
/ 16 февраля 2020

Все, что я пытаюсь сделать, это заполнить массив числами по порядку. Итак, array [0] [0] = 0, array [0] [1] = 1, et c. Почему это не работает? Я не могу понять это.

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)

Ответы [ 4 ]

1 голос
/ 16 февраля 2020

когда вы инициируете переменную 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]]
0 голосов
/ 16 февраля 2020

Вы также можете использовать 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)
0 голосов
/ 16 февраля 2020

Когда вы используете этот синтаксис для создания многомерного массива

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]]
0 голосов
/ 16 февраля 2020

Вы можете сделать это:

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 - это список.

Поэтому, когда вы меняете элемент enet на l, он меняет все l в вашем списке.

Итак, ваш код работает нормально, но каждый раз, когда вы меняете другой список , весь предыдущий список будет выполнен.

...