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