使用 Bisect 模块的线性列表插入算法中忽略了 Try-Except 子句 (Python)

Try-Except Clause Ignored in Linear List Insertion Algorithm Using Bisect Module (Python)

我正在尝试使用 input() 以及 Python 中 bisect 模块的 bisect()insort() 函数将元素插入到线性列表中3.7.为了只接受整数输入,我尝试添加一个 try-except 子句(如对 的回答中所建议的)为:

import bisect
m=[0,1,2,3,4,5,6,7,8,9]
print("The list is:", m)
item=input("Enter element to be inserted:")
try:
    item=int(item)
except ValueError:
    print("Invalid!")
ind=bisect.bisect(m, item)
bisect.insort(m, item)
print("Item inserted at index:", ind)
print("List after insertion:", m)

我希望 Python 在输入浮点数时捕获异常,但它忽略了 try-except 子句并显示如下:

ind=bisect.bisect(m, item) TypeError: '<' not supported between instances of 'str' and 'int'

可能是什么问题?

编辑:

except ValueError 更改为 except TypeError 并输入“5.0”时,我收到了 ValueError:

item=int(item) ValueError: invalid literal for int() with base 10: '5.0'

问题是,当您使用 try/except 子句捕获错误时,您没有做任何事情来确保 item 实际上是 int.

更合理的做法是循环直到输入可以转换为int,例如:

import bisect


m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("The list is:", m)

# : loop until the input is actually valid
is_valid = False
while not is_valid:
    item = input("Enter element to be inserted:")
    try:
        item = int(item)
    except ValueError:
        print("Invalid!")
    else:
        is_valid = True

ind = bisect.bisect(m, item)
bisect.insort(m, item)
print("Item inserted at index:", ind)
print("List after insertion:", m)

请注意 input() 总是得到一个 strint('5.0') 也会抛出一个 ValueError,如果你也想处理这种情况,请使用两个 trys,例如:

import bisect


m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("The list is:", m)

is_valid = False
while not is_valid:
    item = input("Enter element to be inserted:")
    try:
        item = int(item)
    except ValueError:
        try:
            item = int(round(float(item)))
            # or just: item = float(item) -- depends on what you want
        except ValueError:
            print("Invalid!")
        else:
            is_valid = True
    else:
        is_valid = True

ind = bisect.bisect(m, item)
bisect.insort(m, item)
print("Item inserted at index:", ind)
print("List after insertion:", m)