Reputation: 2792
I'm new to list comprehensions and would like to replicate the following code below in for loops into a nested list comprehension.
master = []
inner = []
for x in range(1,8):
inner = []
for y in range(1,x+1):
inner.append(str(x*y).rjust(2))
master.append(inner)
for m in master:
print ' '.join(m)
The output looks like this:
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
I was thinking something like:
test = [
[str(x*y).rjust(2) for x in range(1,8)]
for y in range(1,x+1)
]
for t in test:
print ' '.join(t)
But I get a traceback error:
Traceback (most recent call last):
File "python", line 3, in <module>
NameError: name 'x' is not defined
Any python experts care to point me in the right direction?
Thank you in advance!
Upvotes: 8
Views: 26907
Reputation: 1264
Python 3
print("\n".join([" ".join([str(x*y) for y in range(1,x+1)]) for x in range(1,8) ]))
Python 2
print "\n".join([" ".join([str(x*y) for y in range(1,x+1)]) for x in range(1,8) ])
Two Step Process.
Join the list by space viz. output '1', '2 4', '3 6 9' etc
Join the resultant list by '\n' and print the result
Upvotes: 2
Reputation: 20336
You switched your for
loops. Just switch them back:
test = [
[str(x*y).rjust(2) for y in range(1,x+1)]
for x in range(1,8)
]
for t in test:
print ' '.join(t)
The reason for that is that you want a new list once for each x
, but the inner list has as many numbers as y
.
Upvotes: 3
Reputation: 11961
You could use the following nested list comprehension:
answer = [[i*j for i in range(1, j+1)] for j in range(1, 8)]
print(answer)
Output
[[1],
[2, 4],
[3, 6, 9],
[4, 8, 12, 16],
[5, 10, 15, 20, 25],
[6, 12, 18, 24, 30, 36],
[7, 14, 21, 28, 35, 42, 49]]
Upvotes: 12