Python の「 bisect 」というライブラリについてご紹介します。
import bisectbisect ライブラリは名前のとおり bisection search ーーいわゆる「二分探索法」のための機能を提供するライブラリです。すでにソートされたリストに対して二分探索法を行う関数を提供しています。
具体的には、大きく分けて次の 2 種類の関数が用意されています。
bisect_xxinsort_xx
順番に順番に見ていきます。
bisect_xx
名前が bisect から始まる関数は、二分探索法により指定した値が入るべき箇所の「探索」を行います。探索のみを行い、実際の挿入処理は行いません。
import bisect
li = [1, 9, 15, 32]
x = 15
print bisect.bisect_left(li, x)
# => 2
print bisect.bisect_right(li, x)
# => 3bisect_left() と bisect_right() は、いずれも 2 つの引数を受け取ります。第 1 引数はソート済みのリスト、第 2 引数は検索対象の値です。一方の戻り値は、「第 1 引数のリストに第 2 引数の値を挿入するとすれば、そのインデックスは何になるか」を表す整数値です。
bisect_left() は、同じ値がすでに入っていた場合、その左側に新しい値を挿入するルールのもとに、挿入場所のインデックスを返します。
一方の bisect_right() は、同じ値がすでに入っていた場合に右側に挿入するものとして、そのインデックスを返します。
いずれも lo と hi という引数をオプションで受け取ることができます。 lo はリストの挿入すべき位置の下限を、 hi は上限を指定するために使えます。
print bisect.bisect_left(li, x, lo=0, hi=1)
# => 1left や right が名前についていない bisect() という関数もあり、これは bisect_right() と同じ挙動をします。
insort_xx
insort から始まるメソッドは、二分探索法により指定した値を適切な位置に「挿入」します。 bisect が探索のみを行うのに対し、こちらの insort は実際の挿入を行います。
bisect.insort_left(li, x)
bisect.insort_right(li, x)
print li # => [1, 9, 15, 15, 15, 32]insort_left() ```` insort_right() が受け取る引数は bisect と同様です。第 1 引数に直接変更が加えられるため、戻り値はありません(戻り値は None です)。
left ```` right のルールも bisect と同じで、 insort_left() は挿入できる箇所が複数あったときにいちばん左側に、 insort_right() はいちばん右側に挿入します。
left や right のついていない insort() というメソッドもあり、これは insort_right() と同じ挙動をします。
print bisect.insort(li, x)オプション引数についても bisect と同じで、範囲を制限するための lo ```` hi というオプション引数があります。
以上です。
参考