tags:

views:

173

answers:

2

I find myself frequently writing code like this:

k = 0
for i in mylist:
    # y[k] = some function of i
    k += 1

Instead, I could do

for k in range(K):
    # y[k] = some function of mylist[k]

but that doesn't seem "pythonic". (You know... indexing. Ick!) Is there some syntax that allows me to extract both the index (k) and the element (i) simultaneously using either a loop, list comprehension, or generator? The task is in scientific computing, so there is a lot of stuff in the loop body, making a list comprehension probably not powerful enough on its own, I think.

I welcome tips on related concepts, too, that I might not have even though of. Thank you.

+15  A: 

You can use enumerate:

for k,i in enumerate(mylist):
    #do something with index k
    #do something with element i

More information about looping techniques.

Edit:
As pointed out in the comments, using other variable names like

for i, item in enumerate(mylist):

makes it easier to read and understand your code in the long run. Normally you should use i, j, k for numbers and meaningful variable names to describe elements of a list.
I.e. if you have e.g. a list of books and iterate over it, then you should name the variable book.

Felix Kling
Wow, you people are fast. Thank you very much. (Forget Matlab!)
Steve
enumerate also allows you to start the index where you like using the start parameter. That's pretty handy sometimes.http://docs.python.org/library/functions.html#enumerate
jps
I may be alone in this, but using `i` as the variable to hold each element of the iterable would throw me off when reading this code. Aren't `i` and `j` pretty standard variable names for indexes in looping code?
Will McCutchen
@Will: I agree, I just used it as the OP uses this relation in his question.
Felix Kling
+11  A: 

enumerate is the answer:

for index, element in enumerate(iterable):
    #work with index and element
SilentGhost