Pythonでリストの最大値・最小値から順にn個の要素を取得
Pythonでリストの最大値・最小値から順にn個の要素を取得したい場合、n=1
であれば、組み込み関数max()
, min()
、n>1
であれば、リストをソート(並び替え)する方法と標準ライブラリのheapqモジュールを使う方法がある。
取得する要素の個数が多い場合はsorted()
やsort()
で先にソートするほうが効率的で、少ない場合はheapqモジュールのnlargest()
, nsmallest()
が効率的。
最大値・最小値のインデックスを取得するには、max()
, min()
とindex()
を使う。詳細は以下の記事を参照。
最大値・最小値を取得: max(), min()
リストの最大値・最小値となる要素を取得するには組み込み関数max()
, min()
を使う。
l = [3, 6, 7, -1, 23, -10, 18]
print(max(l))
# 23
print(min(l))
# -10
最大値・最小値から順にn個の要素を取得: ソート
リストの最大値・最小値から順にn個の要素を取得したい場合、まずリストをソート(並び替え)する方法がある。
リストをソートするには、組み込み関数sorted()
か、リストのsort()
メソッドを使う。sorted()
はソートされた新たなリストを返し、sort()
は元のリストを並び替える。
昇順・降順を引数reverse
で切り替え、先頭から任意の個数をスライスで選択すれば、リストの最大値・最小値から順にn個の要素を取得できる。
l = [3, 6, 7, -1, 23, -10, 18]
ld = sorted(l, reverse=True)
print(ld)
# [23, 18, 7, 6, 3, -1, -10]
print(ld[:3])
# [23, 18, 7]
la = sorted(l)
print(la)
# [-10, -1, 3, 6, 7, 18, 23]
print(la[:3])
# [-10, -1, 3]
一行にまとめて書いてもよい。
print(sorted(l, reverse=True)[:3])
# [23, 18, 7]
print(sorted(l)[:3])
# [-10, -1, 3]
元のリストの順番が変わっても問題なければ、sort()
メソッドでもよい。
print(l)
# [3, 6, 7, -1, 23, -10, 18]
l.sort(reverse=True)
print(l[:3])
# [23, 18, 7]
print(l)
# [23, 18, 7, 6, 3, -1, -10]
l.sort()
print(l[:3])
# [-10, -1, 3]
print(l)
# [-10, -1, 3, 6, 7, 18, 23]
最大値・最小値から順にn個の要素を取得: heapqモジュール
リストの最大値・最小値から順にn個の要素を取得したい場合、 標準ライブラリのheapqモジュールを使う方法もある。
heapqモジュールのnlargest()
, nsmallest()
関数を使う。この場合、元のリストは変更されない。
第一引数に取得する要素の個数、第二引数に対象とするイテラブル(リストなど)を指定する。
import heapq
l = [3, 6, 7, -1, 23, -10, 18]
print(heapq.nlargest(3, l))
# [23, 18, 7]
print(heapq.nsmallest(3, l))
# [-10, -1, 3]
print(l)
# [3, 6, 7, -1, 23, -10, 18]
なお、nlargest()
, nsmallest()
関数には第三引数key
も指定可能。
最初に書いたように、取得する要素の個数が多い場合はsorted()
やsort()
で先にソートするほうが効率的で、少ない場合はheapqモジュールのnlargest()
, nsmallest()
が効率的とのこと。
後ろ二つの関数(注:
nlargest()
とnsmallest()
)は n(注: 取得する要素の個数) の値が小さな場合に最適な動作をします。大きな値の時にはsorted()
関数の方が効率的です。さらに、n==1
の時にはmin()
およびmax()
関数の方が効率的です。 heapq --- ヒープキューアルゴリズム — Python 3.11.3 ドキュメント