Как проверить, находится ли пользовательский ввод в списке Python - PullRequest
0 голосов
/ 04 марта 2020

У меня проблемы с проверкой, находится ли пользовательский ввод s в списке, который я печатаю пользователю. Список rows печатается как [(1, 'Data', 'match both vlan-profile'), (2, 'Data', 'match neither vlan-profile')], и в основном я хочу, чтобы после того, как пользователю показали список профилей, выберите тот, который он хочет использовать, исходя из числа в начале. До сих пор то, что у меня есть, заставляет моего l oop говорить "Sorry, please select a number listed above.", так что, очевидно, он не находит значения 1 или 2 в списках. Я ценю любую помощь с этим!

def select_vlan():
    cursor.execute('SELECT * FROM vlan_prof')

    rows = cursor.fetchall()

    for row in rows:
        # row[i] each column in the table
        print(row[0],row[1],row[2]) 

^ это выводит 2 строки для проверки пользователем: «1 данные совпадают с vlan-профилем» «2 данные не соответствуют ни vlan-профилем»

    while True:
        try:
            s = input("Enter number of VLAN profile you wish to use: ")
            print(s)
        except ValueError:
            print("Sorry, please select by number.")
            continue
        if s not in rows:
            print("Sorry, please select a number listed above.")
            continue
        else:
            #age was successfully parsed, and we're happy with its value.
            #we're ready to exit the loop.
            break

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

Ваш тест не совсем правильный. Также убедитесь, что вы тестируете тип int == тип int.

while True:
...
    if not [row for row in rows if int(s) == int(row[0])]:
        print("Sorry, please select a number listed above.")
        continue
0 голосов
/ 04 марта 2020

Вот простое решение:

lst = [(1, 'Data', 'match both vlan-profile'), (2, 'Data', 'match neither vlan-profile')]
s = input("Enter number of VLAN profile you wish to use: ")
if next(x for x in lst if s == x[0], None) is not None:
    # do something
0 голосов
/ 04 марта 2020

Решение показано ниже:

rows = [(1, 'Data', 'match both vlan-profile'), (2, 'Data', 'match neither vlan-profile')]
row_checker = [x[0] for x in rows]      # Note This
while True:
        try:
            s = input("Enter number of VLAN profile you wish to use: ")
            print(s)
        except ValueError:
            print("Sorry, please select by number.")
            continue
        if int(s) not in row_checker:    # note this
            print("Sorry, please select a number listed above.")
            continue
        else:
            #age was successfully parsed, and we're happy with its value.
            #we're ready to exit the loop.
            break

То, что происходит: rows - это список кортежей, а s - целое число. Вы находите целое число в списке кортежей и, следовательно, пока l oop не ломается.

Решение, показанное выше, извлекает первый элемент из каждого кортежа в другой список, и вы можете использовать это для проверки.

Обратите внимание, что s - это строка, и вам нужно целое число , поэтому при сравнении вам необходимо преобразовать s из строки в целое число.

Дайте мне знать, если это помогает !!

0 голосов
/ 04 марта 2020

Предполагая, что столбец вашего запроса для проверки - строка [0], затем установите массив для этого

checker=[]
for row in rows:
  checker.append(row[0])

Затем преобразуйте входные данные в целое число и используйте это позже, чтобы проверить правильные значения

try:
   s = int(input("Enter number of VLAN profile you wish to use: "))
...

if s not in checker:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...