Re: matx3.py

Mats Wichmann <[email protected]>
Newsgroups gmane.comp.python.tutor
Message-ID <[email protected]>
On 12/27/23 15:34, Ethan Rosenberg wrote:
> Tutor -

> mat = [[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]

> I receive an error that  mat[k] = i*j is a tuple??

believe it or not your initialization of mat sets it to a tuple - a 
tuple consisting of three lists, each consisting of three lists 
containing a single element. The interactive interpreter will try to 
show it as a tuple by adding parens, but it's not the parens that make 
it a tuple: comma-separated elements that aren't otherwise enclosed in 
known container syntax (e.g. list, set, dict) makes it a tuple.

 >>> mat = [[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]
 >>> type(mat)
<class 'tuple'>
 >>> mat
([[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]])
 >>>

It's doubtful this is what you want. Nor your later code where you nest 
loops three deep and will end up repeating stuff you don't expect. A 
print statement here will show you what's happening:

....
         for k in range(0,8):
             print(f"Setting mat[{k}] to {i * j}")
             mat[k] = i*j

Giving:
Setting mat[0] to 0
Setting mat[1] to 0
Setting mat[2] to 0
Setting mat[3] to 0
Setting mat[4] to 0
Setting mat[5] to 0
Setting mat[6] to 0
Setting mat[7] to 0
Setting mat[0] to 0
Setting mat[1] to 0
Setting mat[2] to 0
Setting mat[3] to 0
Setting mat[4] to 0
Setting mat[5] to 0
Setting mat[6] to 0
Setting mat[7] to 0
Setting mat[0] to 0
Setting mat[1] to 0
Setting mat[2] to 0
Setting mat[3] to 0
Setting mat[4] to 0
Setting mat[5] to 0
Setting mat[6] to 0
Setting mat[7] to 0
Setting mat[0] to 1
Setting mat[1] to 1
Setting mat[2] to 1
Setting mat[3] to 1
Setting mat[4] to 1
Setting mat[5] to 1
Setting mat[6] to 1
Setting mat[7] to 1

Notice the repeat setting of mat[0] through mat[7] (and no mat[8]), to 
the wrong values, and think for a while until you understand why it's 
working this way.

As I expect people have pointed out to you (sorry haven't followed the 
whole thread), Python itself has no concept of a two-dimensional matrix. 
If you want that, use the (external, and very popular) numpy module. 
You can fake it with a list (single-dimensional array), as you're trying 
to do.

If I've twigged what you want, something like this can set it up, trying 
to avoid zero values - again, it's kind of a guess that this is what 
you're after:

mat = []
for i in range(1, 4):
     for j in range(1, 4):
         mat.append(i * j)

You can write that whole thing as a "list comprehension", which is a bit 
more advanced:

mat = [i * j for i in range(1, 4) for j in range(1, 4)]

And to print it out so it "looks" like a matrix you can get a little tricky:

for idx, elem in enumerate(mat, start=1):
     print(elem, end=" " if idx % 3 else "\n")

That causes each third element to emit a line break after it's printed, 
the other two will emit a space. The print function syntax shown is 
slightly advanced, don't worry if you haven't seen that yet, you can 
come back to that later.


_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.