ホーム テクノロジー 開発 Python でフロア分割を実行する方法

Python でフロア分割を実行する方法

このチュートリアルでは、Python でフロア分割を実行する方法を学びます。コード例とともに、Python の // 演算子、Python の数学モジュールのフロア関数などを使用します。

Python の算術演算子の概要から始めて、フロア除算演算子 // がどのように機能するかを学びます。次に、算術モジュールや演算子モジュールの関数を含む他の同等のメソッドを使用してフロア分割を実行する方法を学びます。

始めましょう…

Python の算術演算子

Python では、算術演算子を使用して、 int および float データ型の数値に対して単純な算術演算を実行できます。これらの演算子はオペランド (数値) に作用し、演算の結果を返します。

Python の算術演算子
Python の算術演算子

次の表は、Python の算術演算子とその動作をまとめたものです。

オペレーター 構文 結果
加算(+) num1+num2 num1 num2 の合計を返します
減算(-) num1-num2 num1 num2 の差を返します。
乗算(*) num1*num2 num1 num2 の積を返します。
べき乗 (**) num1**num2 num1 num2 乗の結果を返します。 num1 num2
分割 (/) num1/num2 num1 num2 で割った結果 (小数部分も含む) を返します。
フロア区分(/) num1//num2 num1 num2 で割ったときの商を返します。
モジュロ (%) num1 % num2 num1 num2 で割ったときの余りを返します。

これらの算術演算子を使用する例をいくつか見てみましょう。これらの例は、Python REPL または のオンライン Python エディターで試すことができます。

 >>> num1 = 18
>>> num2 = 5

>>> num1 + num2
23

>>> num1 - num2
13

>>> num1 * num2
90

>>> num1 ** num2
1889568

この例では、 num1 は 18、 num2 は 5 です。除算演算 num1/num2 は、小数部分を含む結果を返します。

数字の 5 は 18 に 3 回入り、残りは 3 になります。したがって、フロア除算演算 num1//num2 では商 3 が得られ、モジュロ演算子では剰余が得られます (この場合も 3)。

 >>> num1/num2
3.6

>>> num1//num2
3

>>> num1 % num2
3

これにより、除算、フロア除算、モジュロ演算子がどのように機能するかが理解できるはずです。次に、フロア分割演算子について詳しく学習します。

⚠️ Python 2 では、除算演算 (/) は、Python 3 の床除算演算と同様に、結果を最も近い整数に切り捨てます。このチュートリアルでは、Python 3.x で床除算演算がどのように機能するかについて説明します。

// 演算子を使用したフロア分割

オペレーターを使用したフロア部門
オペレーターを使用したフロア部門

被除数と除数を使用した除算演算を考えてみましょう。 num1/num2 では、 num1 が被除数、 num2 が除数です。 num1 num2 のフロア分割を実行するには、 num1//num2 を使用します。

フロア除算演算子 (//) は、オペランドのデータ型に応じて、除算演算の商を整数または浮動小数点数として返します。

フロア除算演算子は、答えが常に整数であることを保証しません。被除数 ( num1 ) または除数 ( num2 ) が浮動小数点の場合、 num1//num2 の結果は浮動小数点になります。以下にいくつかの例を示します。

 >>> 18.0//5
3.0
>>> 10.0//4
2.0
>>> 15//4.0
3.0

結果を整数にする必要がある場合は、 int() 関数を使用して明示的に整数にキャストする必要があります。

 >>> int(18.0//5)
3
>>> int(10.0//4)
2
>>> int(15//4.0)
3

ボンネットの下では何が起こっているのでしょうか?

フロア除算演算子 // を使用すると、 特別なメソッド (ダンダー メソッドとも呼ばれる) __floordiv__() が呼び出されます。したがって、次に示すように、任意の整数または浮動小数点数に対して __floordiv__() メソッドを使用することもできます。

 num1 = 18
num2 = 5
num1.__floordiv__(num2)
# Output: 3

Operator.floordiv() を使用したフロア分割

フロア部門を使用するoperator.floordiv
フロア部門を使用するoperator.floordiv

💡 Python でフロア分割を実行するには、 operator モジュールの floordiv() 関数 を使用することもできます。

Python の 演算子モジュールには、 すべての算術演算を実行できる効率的な関数の定義が含まれています。したがって、フロア分割を実行するには、// 演算子の代わりに、演算子モジュールの floordiv() 関数を使用することもできます。

演算子モジュールから floordiv() 関数を使用することは、floor除算演算子を使用することと同じです。

 >>> import operator
>>> operator.floordiv(18,5)
# Output: 3
>>> operator.floordiv(12,5.0)
# Output: 2.0

math.floor() を使用した床の除算

フロア機能はどのように機能しますか?

数学では、 floor() 関数は任意の実数 x を入力として受け取り、整数 (結果) を返します。この結果は、実数 x 以下の 最大の整数 です。

これをよりよく理解するために、いくつかの例を取り上げて、これらの数値を数直線上で視覚化してみましょう。

例 1 : 数値 2.3 を考えてみましょう。 2.3 以下の最大の整数は 2 です。したがって、floor(2.3) は 2 を返します。

python-floordivision-tutorial-ex1
python-floordivision-tutorial-ex1

2: 負の数値を扱う場合にも同じ定義を適用できます。 -1.7 という数字を考えてみましょう。 -1.7 以下の最大の整数は -2 です。したがって、floor(-1.7) は -2 を返します。

python-floordivision-tutorial-ex2
python-floordivision-tutorial-ex2

math モジュールの floor() 関数を使用して、上記の結果を検証してみましょう。

 >>> from math import floor
>>> floor(2.3)
2
>>> floor(-1.7)
-2

フロア分割を実行するには、引数として num1/num2 を指定して、 floor() 関数を呼び出すことができます。結果を最も近い整数に切り捨てるか切り捨てるため、フロア除算演算と同等になります。

以下に示すように、 math モジュールから floor() 関数を明示的にインポートできます。

 from math import floor
num1 = 18
num2 = 5
floor(num1/num2)
# Output: 3

あるいは、 math モジュールのみをインポートし、 math.floor() を使用して floor() 関数にアクセスすることもできます。

 import math
num1 = 18
num2 = 5
math.floor(num1/num2)
# Output: 3

演算子モジュールの floordiv() 関数やフロア除算演算子 // とは異なり、 math.floor(num1/num2) を使用すると、結果が整数になることが保証されます。この方法により、コードが読みやすくなり、型キャストの手順が不要になります。

 import math
num1 = 18.0
num2 = 5
math.floor(num1/num2)
# Output: 3

Pythonでのフロア分割の例

実用的な例である二分探索で議論を終えましょう。 ✅

📑 二分検索は、ソートされた配列からターゲット要素を O(log n) 時間で検索できる効率的な検索アルゴリズムです ( n は配列のサイズ)。

このアルゴリズムは、各ステップで検索間隔を半分に分割することで機能します。これは、間隔の中間点がターゲットと一致するか (一致が見つかったら検索は終了します!)、ターゲットより小さいか大きいかに応じて行われます。配列のサイズはステップごとに半分に減少するため、中点は必ずしも整数に評価されるわけではありません。

 itemlist = [5,7,18,21,34,45]
item = 7

次の二分探索アルゴリズムの実装を考えてみましょう。関数 binary_search() 数値 ( item ) とリスト ( itemlist ) を受け取り、 itemlist 内の item の出現を検索します。

  • item が見つかった場合、関数は item が出現するインデックスを返します。
  • それ以外の場合は、 None を返します。
 def binary_search(item, itemlist):
    # get the list size
    listsize = len(itemlist) - 1
    # start at the two ends of the list
    lowerIdx = 0
    upperIdx = listsize

    while lowerIdx <= upperIdx:
        # calculate the middle point
        # use normal division instead of floor division
        midPt = (lowerIdx + upperIdx)/ 2 

        # if item is found, return the index
        if itemlist[midPt] == item:
            return midPt
        # otherwise get the next midpoint
        if item > itemlist[midPt]:
            lowerIdx = midPt + 1
        else:
            upperIdx = midPt - 1

    if lowerIdx > upperIdx:
        return None

この実装は、検索の進行中に midPt が整数に評価されないことを考慮していないことを除いて、機能的には正しいです。

 binary_search(item,itemlist)

この関数を呼び出すと、リストのインデックスが浮動小数点ではなく整数またはスライスでなければならないことを示す TypeError が発生します。

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-a5f12ebc3145> in <module>
----> 1 binary_search(item,itemlist)

<ipython-input-2-524ef6900b1f> in binary_search(item, itemlist)
     12 
     13         # if item is found, return the index
---> 14         if itemlist[midPt] == item:
     15             return midPt
     16         # otherwise get the next midpoint

TypeError: list indices must be integers or slices, not float

フロア除算演算子を使用するように関数定義を変更します。

 def binary_search(item, itemlist):
    # get the list size
    listsize = len(itemlist) - 1
    # start at the two ends of the list
    lowerIdx = 0
    upperIdx = listsize

    while lowerIdx <= upperIdx:
        # calculate the middle point
        # use floor division
        midPt = (lowerIdx + upperIdx)// 2 

        # if item is found, return the index
        if itemlist[midPt] == item:
            return midPt
        # otherwise get the next midpoint
        if item > itemlist[midPt]:
            lowerIdx = midPt + 1
        else:
            upperIdx = midPt - 1

    if lowerIdx > upperIdx:
        return None

この関数は、項目 7 が見つかったインデックス (インデックス 1) を返します。

 binary_search(item,itemlist)
# Output: 1

結論

このチュートリアルが、Python でフロア分割を実行する方法を理解するのに役立つことを願っています。これまでに学んださまざまな方法の概要を以下に示します。

  • Python では、 演算子 b は、 a と b をオペランドとして演算子によって定義された演算を実行し、演算の結果を返します。
  • Python の床除算演算子 //; を使用できます。 a//b は、 除算演算 a/b の商を返します。
  • あるいは、Python のオペレータ モジュールで定義されている同等の Floordiv() 関数を 、operator.floordiv(a,b) という構文で使用して、a//b の結果を取得することもできます。
  • 上記のすべてのメソッドは商を返しますが、データ型は a と b の値に応じて float または int になります。したがって、戻り値を整数にキャストする必要があります。
  • Python の math モジュールの Floor() 関数を使用してフロア除算を実行することもできます。 math.floor(a,b) は a//b と同等であり、整数を返します。結果を整数にしたい場合は、数学モジュールの Floor 関数の使用を検討してください。

次に、Python でdefaultdict を操作する方法を学びます。 👩🏽‍💻

「 Python でフロア分割を実行する方法」についてわかりやすく解説!絶対に観るべきベスト2動画

【Python入門・応用講座】13.文字列|結合や分割、検索、置換、formatメソッドの使い方を解説(初心者にもわかりやすく)
【毎日Python】Pythonでデータを等間隔のビンに分割する方法|pandas.cut