Подтвердить что ты не робот

TypeError: индексы индексов должны быть целыми, а не float

У меня есть программа 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

У меня возникли проблемы с пониманием того, что означает это сообщение об ошибке.

4b9b3361

Ответ 1

Похоже, вы используете Python 3.x. Одним из важных отличий в Python 3.x является способ обработки деления. Когда вы выполняете x / y, целое число возвращается в Python 2.x, потому что десятичное значение усечено (разделение полов). Однако в 3.x оператор / выполняет "истинное" деление, в результате вместо 1 / 2 = 0.5) появляется float. Это означает, что теперь вы пытаетесь использовать float для ссылки на позицию в списке (например, my_list[0.5] или даже my_list[1.0]), которая не будет работать, поскольку Python ожидает целое число. Поэтому сначала вы можете попробовать использовать middle = (first + last) // 2, настроив так, чтобы результат возвращал то, что вы ожидаете. // указывает разделение полов на Python 3.x.

Ответ 2

Как воспроизвести вышеприведенную ошибку просто:

>>> stuffi = []
>>> stuffi.append("foobar")
>>> print(stuffi[0])
foobar
>>> stuffi[0] = "failwhale"
>>> print(stuffi[0])
failwhale
>>> stuffi[0.99857] = "skipper"

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not float

Если вы столкнулись с stackoverflow, потому что вы получили эту ошибку. Это означает, что вы не читаете или не понимаете сообщение об ошибке. Сообщение об ошибке совершенное, оно говорит вам точно, что не так, и оно сообщает вам, где вы допустили ошибку.

Массивы индексируются целыми числами, вы передаете в него не целое число, и интерпретатор говорит вам, что вы не можете этого сделать, потому что это не имеет смысла.

Учебники, которые вам нужно пересмотреть, следующие:

"Python array tutorial"
"Python floats and primitive types tutorial"

Ваша переменная должна быть отлита до целого числа, прежде чем ее можно будет использовать для выбора индекса массива.

Koan:

Человек входит в бар и заказывает пиво 1.1195385, бармен закатывает глаза и говорит: TypeError: beer orders must be whole integers, not fractions.

Ответ 3

Я могу ошибаться, но эта строка:

binary_search(names, entered)

не будет

position = binary_search(names, entered)