enumerate() question

G

Gregory Petrosyan

Hello!
I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

Unfortunately, it doesn't =( and I should use (IMHO) ugly

for i,pair in enumerate(coords(dots)):
print i, pair[0], pair[1]

So, why enumerate() works this way and is there any chance of changing
the behaviour?
 
L

Laurent Pointal

Gregory Petrosyan a écrit :
Hello!
I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

Unfortunately, it doesn't =( and I should use (IMHO) ugly


Try:

for i,(x,y) in enumerate(coords(dots)) :
...
for i,pair in enumerate(coords(dots)):
print i, pair[0], pair[1]

So, why enumerate() works this way and is there any chance of changing
the behaviour?

No chance, behavior is correct.

A+

L.Pointal.
 
D

Damjan

I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

for i, (x, y) in enumerate(coords(dots)):
print i, x, y
 
D

Diez B. Roggisch

Gregory said:
Hello!
I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

Unfortunately, it doesn't =( and I should use (IMHO) ugly

for i,pair in enumerate(coords(dots)):
print i, pair[0], pair[1]

So, why enumerate() works this way and is there any chance of changing
the behaviour?


It works that way because enumerate returns a tuple - index, value. And it
doesn't care what is inside value. Actually, it can't - how would you then
write something like this?

l = [1, ('a', 'tuple'), 3]

for i, value in enumerate(l):
print i, value


But your problem can be solved in an elegant fashion anyway. When *you* know
the structure of the values (and who else does?), you can simply use nested
sequence unpacking:

for i, (x, y) in enumerate(coords):
pass

HTH,

Diez
 
L

Leif K-Brooks

Gregory said:
Hello!
I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

Unfortunately, it doesn't =( and I should use (IMHO) ugly

for i,pair in enumerate(coords(dots)):
print i, pair[0], pair[1]


Use:

for i, (x, y) in enumerate(coords(dots)):
print i, x, y
So, why enumerate() works this way and is there any chance of changing
the behaviour?

Because enumerate has no way to distinguish between iterables you do and
don't want unpacked. So, for example, this wouldn't work under your
proposal:

for index, string in ["foo", "bar", "baz"]:
print "String number %s is %s." % (index, string)

But this would:

for index, x, y, z in ["foo", "bar", "baz"]:
print "First character of string number %s is %s." % (index, x)
 
R

Robert Kern

Gregory said:
Hello!
I have a question for the developer of enumerate(). Consider the
following code:

for x,y in coords(dots):
print x, y

When I want to iterate over enumerated sequence I expect this to work:

for i,x,y in enumerate(coords(dots)):
print i, x, y

Unfortunately, it doesn't =( and I should use (IMHO) ugly

for i,pair in enumerate(coords(dots)):
print i, pair[0], pair[1]

So, why enumerate() works this way


Special cases aren't special enough to break the rules.

enumerate shouldn't behave differently for different types of items.
and is there any chance of changing
the behaviour?

No, not really.

Instead, try this:

for i, (x, y) in enumerate(coords(dots)):
print i, x, y

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top