471,119 Members | 1,123 Online

# Best way to have a for-loop index?

I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index: ",elementIndex
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

TIA,
Andrew

Mar 10 '06 #1
8 1464
an*********@gmail.com wrote:
I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index: ",elementIndex
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

for elementIndex, myElement in enumerate(elementList):
print "myElement ", myElement, " at index: ",elementIndex
--Scott David Daniels
sc***********@acm.org
Mar 10 '06 #2
an*********@gmail.com wrote:
I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index: ",elementIndex
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

TIA,
Andrew

enumerate(iterable)

Return an enumerate object. iterable must be a sequence, an iterator, or some
other object which supports iteration. The next() method of the iterator
returned by enumerate() returns a tuple containing a count (from zero) and the
corresponding value obtained from iterating over iterable. enumerate() is useful
for obtaining an indexed series: (0, seq[0]), (1, seq[1]), (2, seq[2]), .... New
in version 2.3

Michael

Mar 10 '06 #3
an*********@gmail.com wrote:
I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index: ",elementIndex
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

TIA,
Andrew

The real question is *why* do you want the index?

If you're trying to iterate through list indicies, you're probably trying
to write C, C++, Fortran, Java, etc in Python.

Can you describe exactly what it is that you're trying to do?
Mar 10 '06 #4
On 9 Mar 2006 16:32:24 -0800
an*********@gmail.com wrote:
I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index:
",elementIndex

My question is, is there a better, cleaner, or easier way
to get at the element in a list AND the index of a loop
than this?

In fact it is so common a need, there is a built-in
function called "enumerate" that does the 'zip' for
you:

for elementIndex, myElement in enumerate(elementList):
print "myElement ", myElement, " at index: ",elementIndex

--
Terry Hancock (ha*****@AnansiSpaceworks.com)
Anansi Spaceworks http://www.AnansiSpaceworks.com

Mar 10 '06 #5
On Thu, 09 Mar 2006 20:22:34 -0500, Roy Smith wrote:
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

TIA,
Andrew

The real question is *why* do you want the index?

If you're trying to iterate through list indicies, you're probably trying
to write C, C++, Fortran, Java, etc in Python.

That's a bit harsh, surely? Well-meaning, but still harsh, and untrue.
Wanting to walk through a list replacing or modifying some or all items in
place is not unpythonic. Sure, you could simply create a new list:

L = [1, 2, 3, 4]
newL = []
for item in L:
if item % 3 == 0:
newL.append(item)
else:
newL.append(item**2)

but that's wasteful if the list is big, or if the items are expensive to
copy.

Isn't this more elegant, and Pythonic?

L = [1, 2, 3, 4]
for index, item in enumerate(L):
if item % 3 != 0:
L[index] = item**2

--
Steven.

Mar 11 '06 #6
Sometimes C++ is the right tool/style for the job, but I don't need the
speed or efficiency of C++.

Apr 5 '06 #7
Roy Smith wrote:
an*********@gmail.com wrote:
I write a lot of code that looks like this:

for myElement, elementIndex in zip( elementList,
range(len(elementList))):
print "myElement ", myElement, " at index: ",elementIndex
My question is, is there a better, cleaner, or easier way to get at the
element in a list AND the index of a loop than this?

TIA,
Andrew

The real question is *why* do you want the index?

If you're trying to iterate through list indicies, you're probably trying
to write C, C++, Fortran, Java, etc in Python.

Interesting. I just wrote some tools today that parse through a bunch
of logfiles and print out something like: "unmatched memory allocation
in line XXX", or something like that. All of them have a main loop like
this:
for lineNumber, line in enumerate(file("some.log")): ...
I don't think there's anything wrong with that, is there a better way
to do it?
Personally, I don't think "enumerate" would be there if it always
encouraged an "unpythonic" programming style. But then again, I'm not
dutch, so I couldn't tell... ;-)

Apr 5 '06 #8
roy spewed:
The real question is *why* do you want the index?

If you're trying to iterate through list indicies, you're probably trying
to write C, C++, Fortran, Java, etc in Python.

Could we stop the stupid continual beratement of people validly asking
about enumerate()? Yes, we want to discourage:

for i in xrange(len(seq)):
seq[i]

but in this case, and many other cases, that is clearly not the
question being posed.

enumerate is one of the most useful built-ins and a love the way it
reads in code. Stop the index-hate.

-Mike

Apr 6 '06 #9

### This discussion thread is closed

Replies have been disabled for this discussion.