2012-06-28 50 views

答えて

33

最小値の検索方法は既に知っているので、その値をindex()関数に入力するだけで、リストのこの値のインデックスを取得できます。すなわち、

n = [20, 15, 27, 30] 
n.index(min(n)) 

利回り

1 

これは、リスト内の最小値のインデックスを返します。いくつかの最小値がある場合は、最初にのを返します。

min():1つの引数iterableを使用すると、空ではない反復可能な要素(文字列、タプルまたはリストなど)の最小項目を返します。複数の引数を指定する場合は、最小の引数を返します。

list.index(x)の最初のアイテムのリスト内のインデックスを返します。値はxです。そのような項目がなければ にエラーがあります。

7

データの複雑さに応じて別のオプション:

import heapq 
s = [20, 15, 27, 30] 
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s))) 
+1

ヒープを構築するためにバインドされ、最もよく知られ、最悪の場合の複雑さを比較するのに対し、O(n)が、あるため、これが速く、一般的に(おそらく)でありますソートにはO(nlog(n))ワーストケースがあります。しかし、これらのデータ構造のPython実装が最良のケース境界と一致することを確実にするために、2つの実装をプロファイルすることは、依然として有効です。 – mvanveen

+0

イテレータで動作するので、私はこれが好きです。 – steveha

10
>>> L = [20, 15, 27, 30] 
>>> min(range(len(L)), key=L.__getitem__) 
1 
5

これは@ジョン・クレメンツの回答に似ています。彼は、heapqを使用しています。つまり、複数の最小値を見つけるために使用できます。 itemgetter()を使用する代わりに、彼はタプル内の値の順序を単に逆転させるので、正しい順序で自然にソートされます。

あなたが必要とするすべては、単一の最も小さい値である場合、これは簡単な方法です:

from operator import itemgetter 
lst = [20, 15, 27, 30] 
i, value = min(enumerate(lst), key=itemgetter(1)) 

enumerate()は、リストから値とそのインデックスをペアリングするPythonで通常の方法です。 (i, value)のようなタプルを返すイテレータを返します。valueは元のシーケンスからの値であり、iはシーケンス内のその値のインデックスです。 min()はイテレータをとることができます。 key=引数は、ペアのインデックス値を無視し、各タプル内の最小の第2の値(インデックス1)を見つける関数に設定されています。

min()は、最小値で見つかったタプルを返し、タプルアンパックを使用して値をivalueに割り当てます。

示す例では、リストであるが、これはイテレータを含む任意の順序で動作します:

from random import randint 
def rseq(n=20): 
    for i in xrange(n): 
     yield randint(0, 101) 

i, value = min(enumerate(rseq()), key=itemgetter(1)) 

itemgetter(n)が呼び出し可能オブジェクトを作る工場であること。 itemgetter(1)を使用すると、シーケンス(この場合はタプル)の2番目のアイテム(インデックス1)を返す呼び出し可能コードを取得できます。また、同じことを行うための機能やlambda関数を書くことができます:

def get1(x): 
    return x[1] 
i, value = min(enumerate(lst), key=get1) 

i, value = min(enumerate(lst), key=lambda x: x[1]) 
+0

もちろん、(少なくともCPythonでは) 'itemgetter'を使って、PythonのコードをCレベルに実行します。 –

+0

@Jon Clements、あなたの答えと同じように逆順でタプルを作成するほうが速いのだろうかと思います。 – steveha

+2

私はパフォーマンスがボトルネックとはかなり違うはずであるとは思っていません。 1カ月から3カ月まで実行するコードを少しずつ取っています。私は満足しています。 2mins54sから2mins30に少しずれている - 私は気にすることはできません - 私は病院システムを運営していません、とにかくIOバインドされています:) –

関連する問題