2012-11-13 14 views
13

Mam Pythona 3.x programu, który jest produkujących błąd:TypeError: lista indeksów muszą być liczbami całkowitymi, nie unosić

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

błędu jest:

TypeError: list indices must be integers, not float 

mam problemy ze zrozumieniem tego, co ten komunikat o błędzie oznacza.

+1

Proszę podać kompletny komunikat o błędzie zawierający informacje zwrotne. – BrenBarn

Odpowiedz

25

Wygląda na to, że używasz Pythona 3.x. Jedną z istotnych różnic w Pythonie 3.x jest sposób obsługi podziału. Gdy wykonasz x/y, liczba całkowita jest zwracana w Pythonie 2.x, ponieważ dziesiętny jest obcięty (podział pięter). Jednak w wersji 3.x operator / wykonuje podział "prawdziwy", co powoduje, że zamiast liczby całkowitej (np. 1/2 = 0.5) jest liczbą całkowitą (float). Oznacza to, że obecnie próbujesz użyć wartości zmiennoprzecinkowej do odniesienia pozycji na liście (na przykład my_list[0.5] lub nawet my_list[1.0]), która nie będzie działać, ponieważ Python oczekuje liczby całkowitej. Dlatego możesz najpierw spróbować użyć funkcji middle = (first + last) // 2, dostosowując ją tak, aby wynik był zgodny z oczekiwaniami. // wskazuje podział podłogi w Pythonie 3.x.

+0

Świetna odpowiedź - bardzo jasne. – gahooa

+0

Dzięki @gahooa :) – RocketDonkey

+0

Świetnie! Dzięki! :) – Francisunoxx

0

Jak odtworzyć powyższy błąd prosto:

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

Jeśli uderzenie stackoverflow bo masz ten błąd. Oznacza to, że nie czytasz lub nie rozumiesz komunikatu o błędzie. Komunikat o błędzie jest doskonały, informuje dokładnie, co jest nie tak i informuje o tym, gdzie również popełniłeś błąd.

Tablice są indeksowane liczbami całkowitymi, w tym celu podawana jest liczba niecałkowita, a tłumacz mówi, że nie można tego zrobić, ponieważ nie ma sensu.

Tutoriale trzeba ponownie są:

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

zmiennej musi być oddane do liczby całkowitej, zanim będzie mógł być użyty, aby wybrać indeks tablicy.

Koan:

Człowiek idzie do baru, a zamówienia 1.1195385 piw, barman przewraca oczami i mówi: TypeError: beer orders must be whole integers, not fractions.

0

mogę się mylić, ale ta linia:

binary_search(names, entered) 

nie będzie

position = binary_search(names, entered)