30

エラーを生成する python 3.x プログラムがあります。

def main():
    names = ['Ava Fischer', 'Bob White', 'Chris Rich', 'Danielle Porter',
             'Gordon Pike', 'Hannah Beauregard', 'Matt Hoyle',
             'Ross Harrison', 'Sasha Ricci', 'Xavier Adams']

    entered = input('Enter the name of whom you would you like to search for:')
    binary_search(names, entered)

    if position == -1:
        print("Sorry the name entered is not part of the list.")
    else:
        print(entered, " is part of the list and is number ", position, " on the list.")
    input('Press<enter>')

def binary_search(names, entered):
    first = 0
    last = len(names) - 1
    position = -1
    found = False

    while not found and first <= last:
        middle = (first + last) / 2

        if names[middle] == entered:
            found = True
            position = middle
        elif names[middle] > entered:
            last = middle - 1
        else:
            first = middle + 1

    return position

main()

エラーは次のとおりです。

TypeError: list indices must be integers, not float

このエラー メッセージの意味がわかりません。

4

5 に答える 5

69

Python 3.x を使用しているようです。Python 3.x での重要な違いの 1 つは、除算の処理方法です。を行うx / yと、Python 2.x では小数点が切り捨てられる (階数除算) ため、整数が返されます。ただし、3.x では、/演算子は「真の」除算を実行しfloat、整数ではなく になります (例: 1 / 2 = 0.5)。これが意味することは、フロートを使用してリスト内の位置を参照しようとしているということです (例:my_list[0.5]またはmy_list[1.0])。これは、Python が整数を想定しているため機能しません。したがって、最初に を使用してmiddle = (first + last) // 2、期待どおりの結果が返されるように調整することをお勧めします。は Python 3.x での//フロア分割を示します。

于 2012-11-13T05:07:23.593 に答える
3

パーティーにちょっと遅れましたが、次のものも使用できます。

middle = int((first + last) / 2)

いずれにせよ、エラーが発生する理由は、RocketDonkey の回答で完全に説明されています。

コードを機能させるには、次の設定も行う必要があります。

position = binary_search(names, entered)

ヒューゴ・フェレイラが述べたように。

この質問も確認してください:除算に使用する場合の「/」と「//」の違いは何ですか?

于 2019-12-16T23:40:20.710 に答える