python-3.x TypeError:列表索引必须是整数,而不是浮点数

j8ag8udp  于 2023-04-13  发布在  Python
关注(0)|答案(7)|浏览(175)

我有一个python 3.x程序,它产生了一个错误:

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

错误是:

TypeError: list indices must be integers, not float

我无法理解此错误消息的含义。

jobtbby3

jobtbby31#

看起来你正在使用Python 3.x。Python 3.x中的一个重要区别是除法的处理方式。当你执行x / y时,Python 2.x中返回一个整数,因为小数被截断了。(floor division)。但是在3.x中,/运算符执行'true'除法,结果是float而不是整数(例如1 / 2 = 0.5)。这意味着您现在正在尝试使用浮点数来引用列表中的位置(例如my_list[0.5]甚至my_list[1.0]),这将不起作用,因为Python需要一个整数。因此,您可能首先要尝试使用middle = (first + last) // 2,调整以使结果返回您期望的结果。//表示Python 3.x中的楼层划分。

xdyibdwo

xdyibdwo2#

有点晚了,但你也可以用途:
middle = int((first + last) / 2)
在任何情况下,为什么你得到你的错误是完美的解释在RocketDonkey的答案。
要使代码正常工作,还应设置:

position = binary_search(names, entered)

就像雨果·费雷拉提到的
也检查这个问题:What is the difference between '/' and '//' when used for division?

6psbrbz9

6psbrbz93#

我在函数testOnData()上使用ANN和PyBrain时遇到了这个问题。
因此,我解决了这个问题,在www.example.com源代码的索引中放入“//”而不是“/”backprop.py。
我改了:

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

我希望它能帮助你。

nuypyhwy

nuypyhwy4#

我可能是错的,但这条线:

binary_search(names, entered)

不会是

position = binary_search(names, entered)
e0bqpujr

e0bqpujr5#

二进制搜索函数的除法运算符出错,应该是//而不是/
又名:

mid = (low + high) // 2
j2datikz

j2datikz6#

这也应该解决问题。虽然其他人已经解释得很好。它总是更好地这样做,以调试可能出了问题。
names[int(middle)]

bprjcwpo

bprjcwpo7#

如果first = 0last = 6,那么使用/运算符,你将得到3.0,所以你的编译器给出错误,因此你需要类型转换它。

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

相关问题