Условие Try-Except игнорируется в алгоритме вставки линейного списка с использованием модуля Bisect (Python) - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь вставить элемент в линейный список, используя input() с bisect() и insort() функциями модуля bisect в Python 3.7. Чтобы принимать только целочисленные входные данные, я попытался добавить предложение try-кроме (как предложено в ответе на: Создание переменной только для целочисленного ввода == целое число в Python ) как:

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-exc и отобразил это скорее:

ind = bisect.bisect (m, item) TypeError: '<'не поддерживается между экземплярами' str 'и' int '</p>

В чем может быть возможная проблема?

Редактировать:

При изменении except ValueError на except TypeError и введя '5.0', я получил ValueError:

item = int (item) ValueError: недопустимый литерал для int () с основанием 10: '5.0'

1 Ответ

1 голос
/ 08 октября 2019

Проблема в том, что, хотя вы улавливаете ошибку с помощью предложения 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() всегда получает str, а int('5.0') также выдает ValueError, если вы хотите обработать этот случай, используйте два try с, например:

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