[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

index() of sequence type?

Neal Becker

2/7/2008 12:41:00 PM

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

If not, shouldn't there be?

6 Answers

Stefan Behnel

2/7/2008 1:19:00 PM

0

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

2/7/2008 1:32:00 PM

0

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

2/7/2008 9:43:00 PM

0

Stefan Behnel <stefan_ml@behnel.de> 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
is not found.

Gabriel Genellina

2/7/2008 9:57:00 PM

0

En Thu, 07 Feb 2008 11:31:44 -0200, Diez B. Roggisch <deets@nospam.web.de>
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,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.

--
Gabriel Genellina

Raymond Hettinger

2/7/2008 10:13:00 PM

0

On Feb 7, 1:57 pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar> wrote:
> 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,2,4,8).index(2)
1


Raymond



Gabriel Genellina

2/7/2008 10:30:00 PM

0

En Thu, 07 Feb 2008 20:13:00 -0200, Raymond Hettinger <python@rcn.com>
escribió:

> On Feb 7, 1:57 pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar> wrote:
>> 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,2,4,8).index(2)
> 1

The Time Machine in action again!

--
Gabriel Genellina