Velocity Reviews > index() of sequence type?

index() of sequence type?

Neal Becker
Guest
Posts: n/a

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

If not, shouldn't there be?

Stefan Behnel
Guest
Posts: n/a

 02-07-2008
Neal Becker wrote:
> 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

Diez B. Roggisch
Guest
Posts: n/a

 02-07-2008
Neal Becker wrote:

> 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

Paul Rubin
Guest
Posts: n/a

 02-07-2008
Stefan Behnel <(E-Mail Removed)> writes:
> 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

Gabriel Genellina
Guest
Posts: n/a

 02-07-2008
En Thu, 07 Feb 2008 11:31:44 -0200, Diez B. Roggisch <(E-Mail Removed)>
escribió:

>> 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.

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,
True

but not:

py> (1,2,4,.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.

--
Gabriel Genellina

Raymond Hettinger
Guest
Posts: n/a

 02-07-2008
On Feb 7, 1:57 pm, "Gabriel Genellina" <(E-Mail Removed)> wrote:
> Tuples are worse: they implement
> __contains__ but not index. So you can say:
>
> py> 2 in (1,2,4,
> True
>
> but not:
>
> py> (1,2,4,.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,2,4,.index(2)

1

Raymond

Gabriel Genellina
Guest
Posts: n/a

 02-07-2008
En Thu, 07 Feb 2008 20:13:00 -0200, Raymond Hettinger <(E-Mail Removed)>
escribió:

> On Feb 7, 1:57 pm, "Gabriel Genellina" <(E-Mail Removed)> wrote:
>> Tuples are worse: they implement
>> __contains__ but not index. So you can say:
>>
>> py> 2 in (1,2,4,
>> True
>>
>> but not:
>>
>> py> (1,2,4,.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,2,4,.index(2)

> 1

The Time Machine in action again!

--
Gabriel Genellina