Pythonでリストの最大値・最小値から順にn個の要素を取得

Modified: | Tags: Python, リスト

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

関連カテゴリー

関連記事