18

番号のリストがあるとしましょう[ 20, 15, 27, 30 ]

このリストの最小値のインデックス番号を返すにはどうすればよいですか。(15)明らかに、min(lst)は最小の数値自体を返しますが、代わりにそのインデックス " 1"を返すにはどうすればよいですか?

4

4 に答える 4

41

最小値を見つける方法はすでに知っているので、その値をindex()関数にフィードするだけで、リスト内のこの値のインデックスを取得できます。つまり、

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

収量

1

これにより、リスト内の最小値のインデックスが返されます。最小値が複数ある場合は、最初のを返すことに注意してください。

min():単一の引数iterableを使用して、空でないiterableの最小項目(文字列、タプル、リストなど)を返します。複数の引数がある場合は、最小の引数を返します。

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

于 2012-06-28T03:21:23.300 に答える
10
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
于 2012-06-28T04:04:40.340 に答える
8

Another option depending on complexity of data:

import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
于 2012-06-28T03:54:25.247 に答える
5

これは、@Jon Clements の回答に似ています。彼の用途はheapq、複数の最小値を見つけるために使用できることを意味します。使用する代わりにitemgetter()、タプルの値の順序を単純に逆にして、自然に正しい順序でソートします。

必要なのは単一の最小値だけである場合、これは簡単な方法です。

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

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

min()最小値で見つかったタプルを返し、タプルのアンパックを使用して値をiandに割り当てます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) を返す callable が得られます。lambda同じことを行う関数または関数を作成することもできます。

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

i, value = min(enumerate(lst), key=lambda x: x[1])
于 2012-06-28T04:08:43.380 に答える