web-dev-qa-db-fra.com

TypeError: les index de la liste doivent être des entiers, pas float

J'ai un programme Python 3.x qui génère une erreur:

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

L'erreur est:

TypeError: list indices must be integers, not float

J'ai du mal à comprendre ce que signifie ce message d'erreur.

19
Dahaka

On dirait que vous utilisez Python 3.x. L'une des différences importantes dans Python 3.x réside dans la gestion de la division. Lorsque vous faites x / y, un entier est renvoyé dans Python 2.x car la décimale est tronquée (division de l'étage). Toutefois, dans la version 3.x, l'opérateur / effectue une division "vraie", ce qui donne une variable float au lieu d'un entier (par exemple, 1 / 2 = 0.5). Cela signifie que vous essayez maintenant d'utiliser un float pour référencer une position dans une liste (par exemple, my_list[0.5] ou même my_list[1.0]), ce qui ne fonctionnera pas car Python attend un entier. Par conséquent, vous voudrez peut-être d’abord essayer d’utiliser middle = (first + last) // 2, en ajustant le résultat pour obtenir le résultat attendu. Le // indique la division du sol dans Python 3.x.

39
RocketDonkey

J'ai eu ce problème en utilisant ANN et PyBrain sur la fonction testOnData (). 

J'ai donc résolu ce problème en plaçant "//" à la place "/" dans l'index du code source de backprop.py.

J'ai changé:

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

À:

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

J'espère que cela vous aidera.

1
Valber Cesar

Je peux me tromper mais cette ligne:

binary_search(names, entered)

ne serait pas

position = binary_search(names, entered)
0
Hugo Ferreira