C. Dow
C. Dow

Reputation: 85

Index function in a simple nested for loop not

So here is the pretty basic code i am working with, it is a function that takes a grid in the form of a tuple of tuples. In the loop I have tried to make i the rows and q the columns for the grid.

def myfunc(grid):  
    for i in (grid): 
        for q in i: 
            print("i.index(q): ", i.index(q), " grid.index(i)", grid.index(i))

    return True

myfunc(((1, 0, 0, 1, 0),
        (0, 1, 0, 0, 0),
        (0, 0, 1, 0, 1),
        (1, 0, 0, 0, 0),
        (0, 0, 1, 0, 0)))

Here is what I get:

i.index(q):  0  grid.index(i) 0
i.index(q):  1  grid.index(i) 0
i.index(q):  1  grid.index(i) 0
i.index(q):  0  grid.index(i) 0
i.index(q):  1  grid.index(i) 0
i.index(q):  0  grid.index(i) 1
i.index(q):  1  grid.index(i) 1
i.index(q):  0  grid.index(i) 1
i.index(q):  0  grid.index(i) 1
i.index(q):  0  grid.index(i) 1
i.index(q):  0  grid.index(i) 2
i.index(q):  0  grid.index(i) 2

and so on.

I expecting and want to get 0, 1, 2, 4, 5, ... for i.index(q), am I not using this function correctly? This seems odd as grid.index(i) is working fine and when I printed q in the for q in i: loop I got the right values.

Any help appreciated!

Upvotes: 1

Views: 62

Answers (2)

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798686

You're using them perfectly. But they're not what you want to use.

def myfunc(grid):  
    for (i, row) in enumerate(grid): 
        for (j, el) in enumerate(row): 
            print('{},{}'.format(i, j))

Upvotes: 1

awesoon
awesoon

Reputation: 33671

tuple.index returns index of first occurrence of the given element:

In [1]: tuple.index?
Docstring:
T.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Type:      method_descriptor

In order to iterate over elements along with their indices, you should use enumerate function:

In [2]: def myfunc(grid):
   ...:     for i, row in enumerate(grid):
   ...:         for j, elem in enumerate(row):
   ...:             print('Row #{}, elem #{}, value: {}'.format(i, j, elem))

In [3]: myfunc(((1, 0, 0, 1, 0),
   ...:         (0, 1, 0, 0, 0),
   ...:         (0, 0, 1, 0, 1),
   ...:         (1, 0, 0, 0, 0),
   ...:         (0, 0, 1, 0, 0)))
Row #0, elem #0, value: 1
Row #0, elem #1, value: 0
Row #0, elem #2, value: 0
Row #0, elem #3, value: 1
Row #0, elem #4, value: 0
Row #1, elem #0, value: 0
Row #1, elem #1, value: 1
Row #1, elem #2, value: 0
Row #1, elem #3, value: 0
Row #1, elem #4, value: 0
Row #2, elem #0, value: 0
Row #2, elem #1, value: 0
Row #2, elem #2, value: 1
Row #2, elem #3, value: 0
Row #2, elem #4, value: 1
Row #3, elem #0, value: 1
Row #3, elem #1, value: 0
Row #3, elem #2, value: 0
Row #3, elem #3, value: 0
Row #3, elem #4, value: 0
Row #4, elem #0, value: 0
Row #4, elem #1, value: 0
Row #4, elem #2, value: 1
Row #4, elem #3, value: 0
Row #4, elem #4, value: 0

Upvotes: 0

Related Questions