Pythonで最大N個または最小N個の値を見つける(検索する)

Pythonで最大N個または最小N個の値を見つける、もしくは検索することについて解説しています。

heapqモジュールを使用することで、Pythonでコレクション内の最大の要素を見つける。または最小の要素を見つけることができます。heapqモジュールは、Pythonの標準ライブラリですので、事前にインストールする必要はありません。

■Python

Google Colaboratory(Google Colab),Python3.7.10

■最大N個または最小N個の値を見つける

では、早速heapqモジュールを使用し、最大N個または最小N個の値を見つけるスクリプトを書いていきます。

■コード

import heapq

nums = [0,1,4,5,6,50,100,99,88,-10,-55,-100]

print('最大値:',heapq.nlargest(2,nums))
print('最小値:',heapq.nsmallest(2,nums))

importでheapqモジュールを呼び出します。

呼び出した後に、numsという変数を作成し、その中にリストを定義します。定義する場合は角括弧([ ])を使用します。リストの中に値(要素)として数値を入れて格納します。

その後、heapq.nlargest()関数を使用します。heapq.nlargest()関数の括弧内には、第1の引数,パラメーターとして、取得する値(要素)の個数を渡します。今回は「2」とします。第2の引数,パラメーターとして、値(要素)を取得するためのリストなどを渡します。今回はnums変数とします。これで最大値から順番に値(要素)を取得することができます。

取得した値をprint()関数で出力します。

次にheapq.nsmallest()関数を使用します。heapq.nsmallest()関数の括弧内には、第1の引数,パラメーターとして、取得する値(要素)の個数を渡します。今回は「2」とします。第2の引数,パラメーターとして、値(要素)を取得するためのリストなどを渡します。今回はnums変数とします。これで最小値から順番に値(要素)を取得することができます。

取得した値をprint()関数で出力します。

■実行

このスクリプトを実行してみます。

実行してみると、heapq.nlargest()関数と、heapq.nsmallest()関数を使用したことで、numsという変数に定義したリストの中から、最大値と最大値をそれぞれN個(2個)取得し、print()関数で出力させることができました。

■辞書を作成し最大N個または最小N個の値を見つキーを取得する

次に辞書を作成し最大N個または最小N個の値を見つキーを取得するスクリプトを書いていきます。

■コード

import heapq

test = {
'田中': 99,
'吉田': 34,
'杉本': 50,
'後藤': 75,
'外園': 11,
'木本': 22,
}

top = heapq.nlargest(3,test,key=test.get)
down = heapq.nsmallest(3,test,key=test.get)

print(top)
print(down)

今回はtestという辞書を波括弧”{}”を使用し作成します。辞書内にはキー(文字列)と値(数値)をペアでセットし格納します。

格納後、topという変数を作成し、heapq.nlargest()関数を使用します。heapq.nlargest()関数の括弧内には、第1の引数,パラメーターとして、取得する値(要素)の個数を渡します。今回は「3」とします。第2の引数,パラメーターとして、値(要素)を取得するためのリストなどを渡します。今回はnums変数とします。

ここまでの2つのパラメーターでスクリプトを実行すると、キーのみが比較されてしまうので、第3の引数,パラメーターとして「key=」と記述し、その後に「test(変数).get」とします。これで、キーとペアになっている値(要素)が比較されて、最大値から順番にキーを取得することができます。

次にdownという変数を作成し、heapq.nsmallest()関数を使用します。heapq.nsmallest()関数の括弧内には、第1の引数,パラメーターとして、取得する値(要素)の個数を渡します。今回は「3」とします。第2の引数,パラメーターとして、値(要素)を取得するためのリストなどを渡します。今回はnums変数とします。

ここまでの2つのパラメーターでスクリプトを実行すると、キーのみが比較されてしまうので、先ほどと同じように、第3の引数,パラメーターとして「key=」と記述し、その後に「test(変数).get」とします。これで、キーとペアになっている値(要素)が比較されて、最小値から順番にキーを取得することができます。

最後にそれぞれ取得した最大と最小のキーをprint()関数で出力します。

■実行

このスクリプトを実行してみます。

実行してみると、heapq.nlargest()関数と、heapq.nsmallest()関数を使用したことで、testという辞書内で、キーと値のペアの値が比較されて、最大値と最小値のキーを、print()関数で出力することができました。

■lambda関数を使用し、複雑なリスト内の中から最大値または最小値の値を見つける

次にlambda関数を使用し、複雑なリスト内の中から最大N個または最小N個の値を見つけるスクリプトを書いていきます。

■コード

import heapq

test =[
       {'名前':'田中','能力':75,'魔法':10},
       {'名前':'小森','能力':99,'魔法':25},
       {'名前':'杉本','能力':40,'魔法':30},
       {'名前':'長崎','能力':23,'魔法':70},
       {'名前':'宮本','能力':87,'魔法':101},
       {'名前':'鍋島','能力':55,'魔法':5},
]

top = heapq.nlargest(3,test,key=lambda t:t['魔法'])
down = heapq.nsmallest(3,test,key=lambda d:d['魔法'])

print(top)
print(down)

今回は、testという複雑なリストを作成し、その中にキー(文字列)と値(数値)のペアを複数格納します。このリスト内から特定のキー(文字列)と値(数値)のペアを取得し、最大値または最小値の値を見つけるために、まずはtopという変数を作成し、その中でheapq.nlargest()関数を使用します。heapq.nlargest()関数の括弧内には、第3の引数,パラメーターとして、「key=」と記述し、lambda関数を使用し、「t」という引数を作成し、実行される式を作ります。今回は角括弧”[]”でリスト内の「魔法」というキーを対象とします。これで、キーとペアの値(要素)が比較され、最大値から順番に値(要素)とペアのキーが取得されます。

同じようにして、downという変数を作成し、その中でheapq.nsmallest()関数を使用します。heapq.nsmallest()関数の括弧内には、第3の引数,パラメーターとして、「key=」と記述し、lambda関数を使用し、「d」という引数を作成し、実行される式を作ります。今回は角括弧”[]”でリスト内の「魔法」というキーを対象とします。これで、キーとペアの値(要素)が比較され、最大値から順番に値(要素)とペアのキーが取得されます。

top変数とdown変数に格納したものをそれぞれprint()関数で出力します。

■実行

このスクリプトを実行してみます。

実行してみると、testという複雑なリストですが、heapq.nlargest()関数とheapq.nsmallest()関数を使用することで、特定のキー(文字列)と値(数値)のペアから、最大値または最小値の値を見つけることができました。

コメント

タイトルとURLをコピーしました