数字のリストがあります[ 20, 15, 27, 30 ]
リスト内の最小の番号のインデックス値を見つける?
このリストの中で最も小さい値のインデックス番号を返します。 (15
)明らかに、min(lst)は最小の数値そのものを返しますが、その代わりにインデックス "1
"を返しますか?
数字のリストがあります[ 20, 15, 27, 30 ]
リスト内の最小の番号のインデックス値を見つける?
このリストの中で最も小さい値のインデックス番号を返します。 (15
)明らかに、min(lst)は最小の数値そのものを返しますが、その代わりにインデックス "1
"を返しますか?
最小値の検索方法は既に知っているので、その値をindex()
関数に入力するだけで、リストのこの値のインデックスを取得できます。すなわち、
n = [20, 15, 27, 30]
n.index(min(n))
利回り
1
これは、リスト内の最小値のインデックスを返します。いくつかの最小値がある場合は、最初にのを返します。
min():1つの引数iterableを使用すると、空ではない反復可能な要素(文字列、タプルまたはリストなど)の最小項目を返します。複数の引数を指定する場合は、最小の引数を返します。
list.index(x): の最初のアイテムのリスト内のインデックスを返します。値はxです。そのような項目がなければ にエラーがあります。
データの複雑さに応じて別のオプション:
import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
これは@ジョン・クレメンツの回答に似ています。彼は、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()
は、最小値で見つかったタプルを返し、タプルアンパックを使用して値をi
とvalue
に割り当てます。
示す例では、リストであるが、これはイテレータを含む任意の順序で動作します:
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])
もちろん、(少なくともCPythonでは) 'itemgetter'を使って、PythonのコードをCレベルに実行します。 –
@Jon Clements、あなたの答えと同じように逆順でタプルを作成するほうが速いのだろうかと思います。 – steveha
私はパフォーマンスがボトルネックとはかなり違うはずであるとは思っていません。 1カ月から3カ月まで実行するコードを少しずつ取っています。私は満足しています。 2mins54sから2mins30に少しずれている - 私は気にすることはできません - 私は病院システムを運営していません、とにかくIOバインドされています:) –
ヒープを構築するためにバインドされ、最もよく知られ、最悪の場合の複雑さを比較するのに対し、O(n)が、あるため、これが速く、一般的に(おそらく)でありますソートにはO(nlog(n))ワーストケースがあります。しかし、これらのデータ構造のPython実装が最良のケース境界と一致することを確実にするために、2つの実装をプロファイルすることは、依然として有効です。 – mvanveen
イテレータで動作するので、私はこれが好きです。 – steveha