TypeError: lijstindices moeten gehele getallen zijn, niet drijven

Ik heb een Python 3.x-programma dat een fout oplevert:

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()

FOUT IS:

TypeError: list indices must be integers, not float

Ik heb problemen met het begrijpen van wat deze foutmelding betekent.


Antwoord 1, Autoriteit 100%

Het ziet eruit alsof je Python 3.x gebruikt. Een van de belangrijke verschillen in Python 3.x is de manier waarop divisie wordt afgehandeld. Wanneer u het doet x / y, wordt een geheel getal geretourneerd in Python 2.x omdat het decimaal is afgekapt (vloerafdeling). In 3.x voert de bediener /echter ‘True’-divisie uit, wat resulteert in een floatin plaats van een geheel getal (bijv. 1 / 2 = 0.5). Wat dit betekent is dat u nu probeert een drijver te gebruiken om een ​​positie in een lijst te verwijzen (bijv. my_list[0.5]of zelfs my_list[1.0]) Niet werken als Python verwacht een geheel getal. Daarom wilt u het eerst proberen te gebruiken middle = (first + last) // 2, aanpassen zodat het resultaat terugkeert wat u verwacht. De //geeft de vloerafdeling aan in Python 3.x.


Antwoord 2, Autoriteit 5%

een beetje laat op het feest, maar u kunt ook gebruiken:

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

In ieder geval waarom u uw fout krijgt, is perfect uitgelegd in RocketDonkey-antwoord.

Voor uw code aan het werk moet u ook instellen:

position = binary_search(names, entered)

Zoals Hugo Ferreira vermeldde.

Controleer ook deze vraag: Wat is het verschil tussen ‘/’ en ‘//’ wanneer gebruikt voor divisie?


Antwoord 3, Autoriteit 2%

Ik had dit probleem bij het gebruik van Ann en Pybrain op Function Testondata ().

Dus loste ik dit probleem op “//” in plaats daarvan “/” in de index op backprop.py broncode.

Ik heb gewijzigd:

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

naar:

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

Ik hoop dat het u zal helpen.


Antwoord 4

Ik kan verkeerd zijn, maar deze regel:

binary_search(names, entered)

zou niet

zijn

position = binary_search(names, entered)

Other episodes