Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: list indices must be integers, not float

I have a python 3.x program that is producing an error:

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

Error is:

TypeError: list indices must be integers, not float

I am having trouble understanding what this error message means.

like image 352
Dahaka Avatar asked Nov 13 '12 04:11

Dahaka


People also ask

How do you fix list indices must be integers?

The Python "TypeError: list indices must be integers or slices, not str" occurs when we use a string instead of an integer to access a list at a specific index. To solve the error, use the int() class to convert the string to an integer, e.g. my_list[int(my_str)] .

How do I fix TypeError list indices must be integers or slices not tuple?

The Python "TypeError: list indices must be integers or slices, not tuple" occurs when we pass a tuple between the square brackets when accessing a list at index. To solve the error, make sure to separate nested list elements with commas and correct the index accessor.

How do you cut a float in Python?

Use the int Function to Truncate a Float in Python The built-in int() function takes a float and converts it to an integer, thereby truncating a float value by removing its decimal places.

How do you convert a float to an int in Python?

A float value can be converted to an int value no larger than the input by using the math. floor() function, whereas it can also be converted to an int value which is the smallest integer greater than the input using math. ceil() function.


Video Answer


3 Answers

It looks like you are using Python 3.x. One of the important differences in Python 3.x is the way division is handled. When you do x / y, an integer is returned in Python 2.x because the decimal is truncated (floor division). However in 3.x, the / operator performs 'true' division, resulting in a float instead of an integer (e.g. 1 / 2 = 0.5). What this means is that your are now trying to use a float to reference a position in a list (e.g. my_list[0.5] or even my_list[1.0]), which will not work as Python is expecting an integer. Therefore you may first want to try using middle = (first + last) // 2, adjusting so that the result returns what you expect. The // indicates floor division in Python 3.x.

like image 170
RocketDonkey Avatar answered Sep 28 '22 09:09

RocketDonkey


Kinda late to the party but you could also use:

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

In any case why you are getting your error is perfectly explained in RocketDonkey answer.

For your code to work you should also set:

position = binary_search(names, entered)

as Hugo Ferreira mentioned.

Also check this question: What is the difference between '/' and '//' when used for division?

like image 35
Nikos Tavoularis Avatar answered Sep 28 '22 08:09

Nikos Tavoularis


I had this problem when using ANN and PyBrain on function testOnData().

So, I solved this problem putting "//" instead "/" inside the index on backprop.py source code.

I changed:

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

I hope it will help you.

like image 34
Valber Cesar Avatar answered Sep 28 '22 09:09

Valber Cesar