TypeError: индексы списка должны быть целыми числами, а не с плавающей запятой

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

Мне сложно понять, что означает это сообщение об ошибке.


person Dahaka    schedule 13.11.2012    source источник
comment
Пожалуйста, предоставьте полное сообщение об ошибке, включая трассировку.   -  person BrenBarn    schedule 13.11.2012


Ответы (4)


Похоже, вы используете Python 3.x. Одним из важных отличий Python 3.x является способ обработки деления. Когда вы выполняете 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.

person RocketDonkey    schedule 13.11.2012

Довольно поздно на вечеринку, но вы также можете использовать:

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

В любом случае, почему вы получаете свою ошибку, прекрасно объясняется в ответе RocketDonkey.

Чтобы ваш код работал, вы также должны установить:

position = binary_search(names, entered)

как сказал Хуго Феррейра.

Также проверьте этот вопрос: В чем разница между '/ 'и' // 'при использовании для деления?

person Nikos Tavoularis    schedule 16.12.2019

У меня возникла эта проблема при использовании ANN и PyBrain в функции testOnData ().

Итак, я решил эту проблему, поместив «//» вместо «/» в индекс исходного кода backprop.py.

Я изменился:

print(('Max error:', 
    max(ponderatedErrors), 
    'Median error:',
     sorted(ponderatedErrors)[len(errors) / 2])) # <-- Error area 

To:

print(('Max error:', 
    max(ponderatedErrors), 
    'Median error:',
     sorted(ponderatedErrors)[len(errors) // 2])) # <-- SOLVED. Truncated

Надеюсь, это вам поможет.

person Valber Cesar    schedule 18.09.2018

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

binary_search(names, entered)

не может быть

position = binary_search(names, entered)
person Hugo Ferreira    schedule 30.03.2017