リストの最大値(最小値)のindexを取得する
NumpyのArrayだと、argmaxを使って、最大値のindexを取得できる。
(ただし、最大値が重複して存在する場合は、一番小さいindexを返す仕様になっている)
numpy.argmax — NumPy v1.10 Manual
PythonのListにも同じような関数が用意されているかと思ったんだけど、ないみたいなので、書き方を調べてみた。
例えば、以下のようなListがあるとする。
list_name = [2, 3, 4, 8, 3, 1, 3, 5, 7, 8, 3, 2]
最大値は8で、最大値の位置するindexは3と9である(最大値には重複がある)。
Numpyのargmaxと同様に、重複がある場合に一番小さいindexを返したい場合には、以下のような書き方がある。
print list_name.index(max(list_name)) print max(enumerate(list_name), key=lambda x: x[1])[0] print max(xrange(len(list_name)), key=lambda i: list_name[i]) import operator print max(enumerate(list_name), key=operator.itemgetter(1))[0] print max(zip(list_name, range(len(list_name))))[1]
一番小さいindexの3を返してくれる。
最後のやつだけ、大きいindexを返してくるが理由は良く分からん。
一部のindexだけでなく、全てのindexを返したい場合には、
print [i for i, x in enumerate(list_name) if x == max(list_name)]
[3, 9]
とリスト内包表記を使って、全ての最大値のindexを求めることが出来る。
いろいろ書き方がありましたが、速度などは比較してないです。
Ref:
リスト内の最大値を見つける - Screaming Loud
python - How to find all positions of the maximum value in a list? - Stack Overflow
python - Pythonic way to find maximum value and its index in a list? - Stack Overflow