Home > Mobile >  how does this python for loop with a loop inside the list work?
how does this python for loop with a loop inside the list work?

Time:05-31

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.

CodePudding user response:

Lets take it step by step.

  1. test = ['x' for i in range(9)]. test here is a list that contains 9 'x's

  2. [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.

  3. 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

  4. 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

CodePudding user response:

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?

  • Related