LoginSignup
5
2

More than 1 year has passed since last update.

pythonのリストでn番目に大きな値とそのindexを取得する

Last updated at Posted at 2022-01-31

はじめに

pythonでリストの最大値・最小値をとってくる方法は簡単です。
しかし、n番目の値やindexをとってくる方法は、調べても出てこなかったため高速に行えるものを書きました。
これはもともとdifflibライブラリ内にあったものを参考にしました。

アルゴリズム

プログラムの順番としては、

  1. 値とインデックスをセットにしたリストを作る
  2. 高速化のためn番目までソートする
  3. ソートしたリストのn番目の中身を取得

です。
ソート時、n番目までしかソートしていないので、高速です。

プログラム

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関数を使用しています。

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番目に大きな値とインデックスを取得する方法を書きました。
プログラムを勉強し始めた人でもわかる内容ですが、いざ書いてみようと思うとなかなかめんどくさくて、ライブラリというものの恩恵を改めて実感しました。
ぜひアレンジして使用してください。

5
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2