Pythonのbisectモジュール徹底解説:insort_leftとinsort_rightの使い方
Pythonのbisectモジュールは、新しい要素を挿入するたびにリスト全体を再ソートすることなく、リストをソート済みの状態に保つための機能を提供します。本記事では、その中でも特に重要なinsort_leftとinsort_rightの2つの関数に焦点を当てて解説します。
insort_leftとは
insort_leftは、指定した値を適切な位置に挿入し、リスト自体を直接更新します。すでに同じ値がリスト内に存在する場合は、その要素群の左端(既存要素の前)に挿入されるのが特徴です。
この関数は最大4つの引数を受け取ります。
- a:操作対象のリスト
- x:挿入する値
- lo:検索範囲の開始位置(デフォルトは0)
- hi:検索範囲の終了位置(デフォルトはリストの長さ)
insort_leftとinsort_rightの違い
insort_rightはinsort_leftとほぼ同じ動作をしますが、同じ値がすでに存在する場合に、既存要素の右側(後ろ)に新しい要素を挿入する点が異なります。重複データの扱い方を制御したい場面で、この違いが重要になります。
構文
bisect.insort_left(a, x, lo=0, hi=len(a)) bisect.insort_right(a, x, lo=0, hi=len(a)) # a : 対象となるシーケンス(リスト) # x : 挿入する値
使用例
以下の例では、まずリストにbisect.insort_leftを適用し、次に検索範囲を限定したbisect.insort_rightを適用しています。
import bisect
listA = [11,13,23,7,13,15]
print("Given list:",listA)
bisect.insort_left(listA,14)
print("Bisect left:\n",listA)
listB = [11,13,23,7,13,15]
print("Given list:",listB)
bisect.insort_right(listB,14,0,4)
print("Bisect right:\n",listB)
実行結果
上記のコードを実行すると、次のような出力が得られます。
Given list: [11, 13, 23, 7, 13, 15]
Bisect left:
[11, 13, 23, 7, 13, 14, 15]
Given list: [11, 13, 23, 7, 13, 15]
Bisect right:
[11, 13, 14, 23, 7, 13, 15]
注意点
bisectモジュールの関数は、リストがすでにソートされていることを前提として設計された二分探索を使用します。ソートされていないリストに適用すると、上記の例のように必ずしも期待どおりの位置に挿入されないことがあります。実際の開発では、sorted()やlist.sort()で事前にリストをソートしてから使用することをおすすめします。
-
Pythonのbisectモジュール完全解説:二分挿入アルゴリズムでソート済みリストを効率的に操作する
Pythonには、bisectという標準モジュールが用意されています。このモジュールを使用すると、二分挿入(バイセクション)アルゴリズムを活用でき、ソート済みリストに対して「どこにデータを挿入すればリストがソートされた状態を保てるか」を高速に調べたり、実際に適切な位置へ要素を挿入したりすることができます。 二分探索をベースとしているため、線形探索のように先頭から順番に比較する必要がなく、大規模なデータでも非常に効率的に動作する点が大きな特徴です。 このモジュールを利用するには、まず以下のようにインポートします。 import bisect bisectモジュールには、主に以下の6つの関数が
-
Pythonモジュール内のすべての関数を一覧表示する方法
dir()関数でモジュールの属性とメソッドを取得するPythonでは、dir()関数を使うことで、指定したモジュールが持つすべての属性やメソッド(関数)の一覧を取得できます。例として、標準ライブラリのmathモジュールに対して使ってみましょう。>>> import math>>> dir(math)[__doc__, __name__, __package__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp