Matt X
Matt X

Reputation: 244

Three values for a for loop

I would like to have three values increment at different speeds. My overall goal is to emulate this pattern:

0,0,   0
0,1,   1
0,2,   2
1,0,   3
1,1,   4
1,2,   5
2,0,   6
2,1,   7
2,2,   8

The first two numbers are easy. I would solve it like this:

for x in range(3):
    for y in range(3):
        print(x, y)
>>> 0 0
>>> 0 1
>>> 0 2
>>> 1 0
>>> 1 1
>>> 1 2
>>> 2 0
>>> 2 1
>>> 2 2

This is the pattern that I want.

The question is how do I increment the third number by one each time, while still having the first two numbers increment in the way that they are?

Basically, how can I make the third number increment by one each time the for loop goes?

Upvotes: 6

Views: 6086

Answers (7)

Ofer Skulsky
Ofer Skulsky

Reputation: 743

This looks more natural to me :)

x_range = 3  
y_range = 3  
for x in range( x_range*y_range ):  
    print(x // x_range, x % x_range, x)  

Similar to what cwharris wrote.

Upvotes: 1

cwharris
cwharris

Reputation: 18125

single variable. single loop.

for i in range(9):
  print(i // 3, i % 3, i)

// is floor division and % is modulus (the remainder, in most cases)

Personally, I like this solution because it plainly explains the underlying pattern, and can therefore be easily altered or extended to other patterns.

Upvotes: 3

Innat
Innat

Reputation: 17219

You can use simply a count variable for this

count = 0
for x in range(3):
    for y in range(3):
        print(x, y, ' ' ,count) # use ' ' for making exact look what OP asked..lol
        count = count + 1

Upvotes: 1

PM 2Ring
PM 2Ring

Reputation: 55469

You don't need nested loops for this. You can use itertools.product to get your first two numbers, and enumerate to get your last one.

from itertools import product

for i, (u, v) in enumerate(product(range(3), repeat=2)):
    print(u, v, i)

output

0 0 0
0 1 1
0 2 2
1 0 3
1 1 4
1 2 5
2 0 6
2 1 7
2 2 8

itertools.product is a very handy function. It basically performs nested loops efficiently, but its main benefit is that they don't look nested, so you don't end up with massively indented code. However, its real strength comes when you don't know how many nested loops you need until runtime.

enumerate is probably even more useful: it lets you iterate over a sequence or any iterable and returns the iterable's items as well as an index number. So whenever you need to loop over a list but you need the list items and their indices as well, it's more efficient to use enumerate to get them both at once, rather than having a loop that uses range to produce the index and then using the index to fetch the list item.

Upvotes: 5

rafaelc
rafaelc

Reputation: 59274

Since we have all these answers, I will post the most straightforward one

count = 0
for x in range(3):
    for y in range(3):
        print(x, y, count)
        count += 1

Upvotes: 7

Hypnotron
Hypnotron

Reputation: 96

Try this:

for x in range(3):
    for y in range(3):
        print(x, y, x * 3 + y) # Python 3.x
        print x, y, x * 3 + y # Python 2.x

Hope this helps.

Upvotes: 2

Mureinik
Mureinik

Reputation: 311163

The third number counts how many total iterations you had so far. For each increment in X it gains the total size of Y's loop, and to that you need to add the value of Y:

X_SIZE = 3
Y_SIZE = 3
for x in range(X_SIZE):
    for y in range(Y_SIZE):
        print(x, y, x * Y_SIZE + y)

Upvotes: 5

Related Questions