Python Forum
Creating 2D array without Numpy - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: Data Science (https://python-forum.io/forum-44.html)
+--- Thread: Creating 2D array without Numpy (/thread-1818.html)



Creating 2D array without Numpy - landlord1984 - Jan-27-2017

I want to create a 2D array and assign one particular element.
The second way below works.
But the first way doesn't.
I am curious to know why the first way does not work.
Is there any way to create a zero 2D array without numpy and without loop?



The first way is:

n=10
Grid=[[0]*n]*n 
Grid[1][1]=1
Quote:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

The second way is:
n=10
Grid = [0] * n
for i in range(n):
    Grid[i] = [0] * n
Grid[1][1]=1
Quote:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]



RE: Creating 2D array without Numpy - ichabod801 - Jan-27-2017

The first way doesn't work because [[0] * n] creates a mutable list of zeros once. Then when the second *n copies the list, it copies references to first list, not the list itself. So you have a list of references, not a list of lists.

The second way a new [0] * n is created each time through the loop. That way there is no copying being done, so you end up with an actual list of lists. I often do the second way with a list comprehension:

[[0] * n for row in n]



RE: Creating 2D array without Numpy - landlord1984 - Jan-27-2017

(Jan-27-2017, 09:43 AM)ichabod801 Wrote: The first way doesn't work because [[0] * n] creates a mutable list of zeros once. Then when the second *n copies the list, it copies references to first list, not the list itself. So you have a list of references, not a list of lists. The second way a new [0] * n is created each time through the loop. That way there is no copying being done, so you end up with an actual list of lists. I often do the second way with a list comprehension:
 [[0] * n for row in n] 

So there is no way to do this by one line code unless to use numpy?

L


RE: Creating 2D array without Numpy - ichabod801 - Jan-28-2017

(Jan-27-2017, 05:29 PM)landlord1984 Wrote: So there is no way to do this by one line code unless to use numpy?

The list comprehension I showed you does it in one line of code.