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 ドキュメント