ошибка записи, когда ничего не возвращается из кортежа в списке

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input(str("colour? "))
for c in tup_list:
    if x in c:
        print(c[0])
    else:
        print("error ")

Пример кода^

Если пользователь вводит «красный», вывод:

111
error
error
444

Если пользователь вводит «синий», вывод:

error
222
error
error

И т. д. Если пользователь вводит «randomchars» (любые случайные символы), которых нет в tup_list, вывод будет таким:

error
error
error
error

Я понимаю, что мой код печатает «ошибку» для каждого c в tup_list. Я хотел бы, чтобы мой код писал «ошибка» один раз, если пользовательский ввод не находится в tup_list. Я также не понимаю, почему ошибки печатаются для каждого отрицательного совпадения в списке tup_list (например, ввод красного цвета дает правильные значения 111 и 444, но также дает две ошибки для кортежей синего и желтого цветов).


person acgf    schedule 06.07.2018    source источник
comment
это ожидается: если совпадение, оно печатает, иначе печатает ошибку ... рассматривали ли вы возможность использования словаря с именами цветов в качестве ключей и числами в качестве значений (в виде списков, поэтому более 1 может быть связано с 1 цветом)? это позволит избежать цикла.   -  person Jean-François Fabre    schedule 06.07.2018


Ответы (3)


Код печатает 'error' для каждого c в tup_list, он не совпадает, потому что вы перебираете каждый c в tup_list. В каждой итерации вы проверяете, совпадает ли цвет, и в каждой итерации вы печатаете, совпадает ли он (кодовый номер) или нет ('error'). У вас может быть логическая переменная, чтобы проверить, соответствует ли она или нет:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input('colour? ')

match = False
for c in tup_list:
    if x in c:
        print(c[0])
        match = True

if not match:
    print('error')
person yyyyyyyan    schedule 06.07.2018
comment
Спасибо! Все остальные решения тоже работали, но это было самым простым. - person acgf; 07.07.2018

Здесь мы сначала собираем список совпадающих элементов, а затем печатаем их или ошибку.

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]
x = input("colour? ")
matches = [c for c in tup_list if x in c]
if matches:
    print('\n'.join(m[0] for m in matches))
else:
    print("error")

(я также заменил str("colour? ") на "colour? ": это уже строка, ее не нужно приводить)

person Eugene Primako    schedule 06.07.2018
comment
Код можно было бы улучшить, если бы список matches состоял только из числовых кодов, поэтому [c[1] for c in tup_list if x in c]. Таким образом, вам не нужен цикл if matches - print('\n'.join(matches)) - person yyyyyyyan; 07.07.2018
comment
@YanOrestes Ты прав. Но я переписал свой код немного по-другому, чтобы продемонстрировать немного другой подход. - person Eugene Primako; 07.07.2018

Поскольку у вас есть оператор if/else в цикле for, он либо находит соответствие для цвета, либо печатает ошибку. Если вы хотите напечатать все совпадения и напечатать только error один раз, вам нужна немного другая структура ветвления.

Я бы рекомендовал:

tup_list = [(111, 'red'), (222, 'blue'), (333, 'green'), (444, 'red')]

matches = []

x = input(str("colour? "))
for c in tup_list:
    if x in c:
        matches.append(c[0])

if matches:
    print("\n".join(map(str, matches)))
else:
     print("error")

Обратите внимание, что я должен отображать каждое совпадение из int в str, так как join() ожидает список строк.

person Daniel Smith    schedule 06.07.2018