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()関数を使用することで、特定のキー(文字列)と値(数値)のペアから、最大値または最小値の値を見つけることができました。
コメント