index() of sequence type?

N

Neal Becker

I see list has index member, but is there an index function that applies to
any sequence type?

If not, shouldn't there be?
 
S

Stefan Behnel

Neal said:
I see list has index member, but is there an index function that applies to
any sequence type?

Like this?

def find_index(seq, value):
try:
find_index = seq.index
except AttributeError:
def find_index(value):
for i,v in enumerate(seq):
if v == value: return i
raise ValueError("index(seq, x): x not in sequence")
return find_index(value)

If not, shouldn't there be?

I don't see the need.

Stefan
 
D

Diez B. Roggisch

Neal said:
I see list has index member, but is there an index function that applies
to any sequence type?

If not, shouldn't there be?

Looks like an oversight to me as well, yes. The only "difficult"
implementation would be the one for xrange, because you can't search but
must compute the result - but that should be trivial.

Diez
 
P

Paul Rubin

Stefan Behnel said:
def find_index(seq, value):
try:
find_index = seq.index
except AttributeError:
def find_index(value):
for i,v in enumerate(seq):
if v == value: return i
raise ValueError("index(seq, x): x not in sequence")
return find_index(value)

It doesn't seem like a great idea to do operations like that on
mutable iterators. But if you must:

from itertools import dropwhile
def find_index(seq, value):
a = dropwhile (lambda x: x[1] != value, enumerate(seq))
return a.next()[0]

seems more direct. I think it will raises StopIteration if the value
is not found.
 
G

Gabriel Genellina

Looks like an oversight to me as well, yes. The only "difficult"
implementation would be the one for xrange, because you can't search but
must compute the result - but that should be trivial.

xrange is iterable, but not a sequence. Tuples are worse: they implement
__contains__ but not index. So you can say:

py> 2 in (1,2,4,8)
True

but not:

py> (1,2,4,8).index(2)

Given that to implement __contains__ it has to scan the values the same
way as index would do, it's like a tuple saying: "I know where that item
is, and you know that I know that, but I won't tell you!" - rather
frustrating.
 
R

Raymond Hettinger

Tuples are worse: they implement
__contains__ but not index. So you can say:

py> 2 in (1,2,4,8)
True

but not:

py> (1,2,4,8).index(2)

You must be using an old version of Python like 2.5 ;-)

As of yesterday, Py2.6 has tuple.index() and tuple.count().

Python 2.6a0 (trunk:60638M, Feb 6 2008, 18:10:45)
[GCC 4.1.1 (Gentoo 4.1.1)] on linux2 1


Raymond
 
G

Gabriel Genellina

Tuples are worse: they implement
__contains__ but not index. So you can say:

py> 2 in (1,2,4,8)
True

but not:

py> (1,2,4,8).index(2)

You must be using an old version of Python like 2.5 ;-)

As of yesterday, Py2.6 has tuple.index() and tuple.count().

Python 2.6a0 (trunk:60638M, Feb 6 2008, 18:10:45)
[GCC 4.1.1 (Gentoo 4.1.1)] on linux21

The Time Machine in action again!
 

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

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,043
Latest member
CannalabsCBDReview

Latest Threads

Top