0

All I am trying to do is populate an array with numbers in order. So, array[0][0] = 0, array[0][1]=1, etc. Why is this not working? I cannot figure it out.

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)
1
  • How is this "not working"? This is important information and should be part of your question. Commented Feb 16, 2020 at 8:08

4 Answers 4

1

when you initiate your arr variable, you are multiplying a list of lists with a number, this results in a "mess" because what you actually do it is to multiply only the reference of the first list (from your list of lists), so actually you have in your arr only one list and a bunch of reference to that list, to fix this you can do:

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

or:

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

after changing this in your code, for numRows = 3 and numColumns = 4 you get:

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
Sign up to request clarification or add additional context in comments.

1 Comment

thank you for the info, this is exactly what i needed to know. So it wasn't the while loop that was the problem, just how i initialized my array (arr variable). Greatly appreciated.
0

When you use this syntax to create multi dimensional array

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

the reference of same element is created many times , so if you assign a value to one of them then you are basically changing all the elements because they all reference to the same data. for ex :

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

output

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

I only changed one element and this is the result . you should use :

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

output :

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

Comments

0

You can do this:

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)

The problem with your code is that you append same array to the main array multiple times, like this [l, l, l] and l is a list.

So when ever you change an elemenet of l it will change all of ls in your list.

So, your code works fine but each time you change another list, all of previous list will be effected.

Comments

0

You can also make use of numpy for creating the structure, followed by using numpy.tolist() for converting it to a python list

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.