Reputation: 3
Can some one explain how this loop works?
test = ['x' for i in range(9)]
for row in [test[i*3: (i+1)*3] for i in range(3)]:
print('1 ' + ' 2 '.join(row) + ' 3')
I thought the output would be:
1 2 x 3
1 2 x 3
1 2 x 3
I can't follow how it inserts 'x' between 1 and 2.
Upvotes: 0
Views: 48
Reputation: 959
Well, printing the first line you will see nine x in a list, so we are generating a list
test = ['x' for i in range(9)]
print(test)
Output:
['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
Next: you could simply write it with two loops where in the first one you loop up to 3 times. And let's print again to understand.
for i in range(3):
print(test[i*3: (i+1)*3])
Output:
['x', 'x', 'x']
['x', 'x', 'x']
['x', 'x', 'x']
As you can see from this output we got three rows each having three numbers of x.
Then, it is possible to loop and print something different like this:
for i in range(3):
for row in [test[i*3: (i+1)*3]]:
print('1 ' + ' 2 '.join(row) + ' 3')
Output:
1 x 2 x 2 x 3
1 x 2 x 2 x 3
1 x 2 x 2 x 3
I hope that it does make sense now! Please let me know if you want a specific explanation for anything else?
Upvotes: 1
Reputation: 3226
Lets take it step by step.
test = ['x' for i in range(9)]
. test
here is a list that contains 9 'x'
s
[test[i*3: (i+1)*3] for i in range(3)]
. Lets call this list a temp_list. This list comprehension takes a slice of test
list. For i
equals to 0, the slice will be test[0: 3]
which is equals to ['x', 'x', 'x']
. For i
equals to 1, the slice will be test[3: 6]
but contains same values as before.
Now for row in ...
. This will loop over what we designated temp_list for better denoting. So this loop will iterate 3 times and row
every time will be ['x', 'x', 'x']
. So the print(..)
will be repeated 3 times
print('1 ' + ' 2 '.join(row) + ' 3')
. The str.join()
actually concatenates every element of an iterable (here a list called row
) with str
(here ' 2 ') acting as a separator between them. So, ' 2 'join(row)
here will produce output x 2 x 2 x
and finally the print()
will print 1 x 2 x 2 x 3
.
So the final output will be -
1 x 2 x 2 x 3
1 x 2 x 2 x 3
1 x 2 x 2 x 3
Upvotes: 1