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). Това означава, че сега се опитвате да използвате float за препратка към позиция в списък (напр. 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