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)
FutureJJ
2,7371 gold badge25 silver badges34 bronze badges
asked Feb 16, 2020 at 7:44
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]]
answered Feb 16, 2020 at 7:56
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]]
answered Feb 16, 2020 at 8:00

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.

answered Feb 16, 2020 at 7:56

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)
answered Feb 16, 2020 at 8:12

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.