Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

index of min element of sequence

200 views
Skip to first unread message

Neal Becker

unread,
Jan 21, 2008, 1:28:40 PM1/21/08
to pytho...@python.org
What's a good/fast way to find the index of the minimum element of a
sequence? (I'm fairly sure sorting the sequence is not the fastest
approach)

Peter Otten

unread,
Jan 21, 2008, 1:48:18 PM1/21/08
to
Neal Becker wrote:

>>> items = "defbhkamnz"
>>> min(xrange(len(items)), key=items.__getitem__)
6
>>> items[6]
'a'

Peter

Paul Rubin

unread,
Jan 21, 2008, 2:38:34 PM1/21/08
to

Python 2.5 (untested):

from operator import itemgetter
minindex = min(enumerate(seq), key=itemgetter(1))[1]

Roger Miller

unread,
Jan 21, 2008, 2:47:50 PM1/21/08
to
On Jan 21, 8:48 am, Peter Otten <__pete...@web.de> wrote:

> Neal Becker wrote:
> > What's a good/fast way to find the index of the minimum element of a
> > sequence?

...

> >>> min(xrange(len(items)), key=items.__getitem__)
...

Or just
items.index(min(items))
I found this to be significantly faster in a simple test (searching a
list of 1000 ints with the minimum in the middle), despite the fact
that it requires two passes. I'm sure that one could find cased where
Peter's approach is faster, so you if you are concerned about speed
you should measure with your own data.

John Machin

unread,
Jan 21, 2008, 3:06:19 PM1/21/08
to
On Jan 22, 6:38 am, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:

Bzzzt!

>>> seq = [1000, 9, 8, 7, 2000, 3000]


>>> from operator import itemgetter
>>> minindex = min(enumerate(seq), key=itemgetter(1))[1]

>>> minindex
7
>>> min(enumerate(seq), key=itemgetter(1))
(3, 7)

s/[1]/[0]/ or more generally:

minindex, minvalue = min(enumerate(seq), key=itemgetter(1))

Peter Otten

unread,
Jan 21, 2008, 3:28:44 PM1/21/08
to
Roger Miller wrote:

I suppose those cases are rare (slow equality check), and even then I
might prefer your solution because it's so much clearer.

Peter

Paul Rubin

unread,
Jan 21, 2008, 3:56:14 PM1/21/08
to
John Machin <sjma...@lexicon.net> writes:
> s/[1]/[0]/ or more generally:

Oops, got two spellings confused. Originally was going to use

from itertools import count, izip
min(izip(seq, count()))[1]

but did it with enumerate instead. I don't know which is actually
faster.

> minindex, minvalue = min(enumerate(seq), key=itemgetter(1))

Cool, I like this best of all. Or alternatively,

minindex, minvalue = min(izip(seq, count()))

John Machin

unread,
Jan 21, 2008, 4:47:06 PM1/21/08
to
On Jan 22, 7:56 am, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:

Bzzzt #2!

>>> from itertools import count, izip
>>> min(izip(seq, count()))

(7, 3)

Paul Rubin

unread,
Jan 21, 2008, 4:53:03 PM1/21/08
to
John Machin <sjma...@lexicon.net> writes:
> >>> from itertools import count, izip
> >>> min(izip(seq, count()))
> (7, 3)

Serves me right for cutting and pasting.

minvalue, minindex = min(izip(seq, count()))

0 new messages