#はじめに
pythonでリストの最大値・最小値をとってくる方法は簡単です。
しかし、n番目の値やindexをとってくる方法は、調べても出てこなかったため高速に行えるものを書きました。
これはもともとdifflibライブラリ内にあったものを参考にしました。
#アルゴリズム
プログラムの順番としては、
- 値とインデックスをセットにしたリストを作る
- 高速化のためn番目までソートする
- ソートしたリストのn番目の中身を取得
です。
ソート時、n番目までしかソートしていないので、高速です。
#プログラム
.py
from heapq import nlargest, nsmallest
lst = [5,2,6,2,7,5,9,5]
n = 3 #この値までソートする
result = [(value,i)for i,value in enumerate(lst)]
max_result = nlargest(n, result)
min_result = nsmallest(n, result)
print("{}番目に大きな値はindex{}の{}です".format(n, max_result[n-1][1], max_result[n-1][0]))
print("{}番目に小さな値はindex{}の{}です".format(n, min_result[n-1][1], min_result[n-1][0]))
#3番目に大きな値はindex2の6です
#3番目に小さな値はindex0の5です
#応用
元のリストの中身を関数で数値化し、その大きさでソートするなら、以下のように書き換えればいいです。
今回は文字の長さで並べ替えています。
タプルのリストを作る際に、len関数を使用しています。
.py
from heapq import nlargest, nsmallest
lst = ["a", "sadfsd", "bas", "dg", "kgkgkg"]
n = 2 #この値までソートする
result = [(len(value),i,value)for i,value in enumerate(lst)]
max_result = nlargest(n, result)
min_result = nsmallest(n, result)
print("{}番目に大きな値はindex{}の{}です".format(n, max_result[n-1][1], max_result[n-1][2]))
print("{}番目に小さな値はindex{}の{}です".format(n, min_result[n-1][1], min_result[n-1][2]))
#2番目に大きな値はindex1のsadfsdです
#2番目に小さな値はindex3のdgです
#まとめ
pythonのリストでn番目に大きな値とインデックスを取得する方法を書きました。
プログラムを勉強し始めた人でもわかる内容ですが、いざ書いてみようと思うとなかなかめんどくさくて、ライブラリというものの恩恵を改めて実感しました。
ぜひアレンジして使用してください。