Ошибка при работе с извлечением инфо из списка- выдает при несуществующем документе три строки "Документ не найден в базе"

documents = [
    {'type': 'passport', 'number': '2207 876234', 'name': 'Василий Гупкин'},
    {'type': 'invoice', 'number': '11-2', 'name': 'Геннадий Покемонов'},
    {'type': 'insurance', 'number': '10006', 'name': 'Аристарх Павлов'}
]

directories = {
    '1': ['2207 876234', '11-2'],
    '2': ['10006'],
    '3': []
}

def get_owner():
    number = input('Введите номер документа:   ')
    for dic in documents:
        if "number" in dic.keys() and dic["number"] == number:
            print('Владелец документа:       ', dic['name'])                         
        else:
            print('Документ не найден в базе')
get_owner()

Ответы (2 шт):

Автор решения: RomanR

Если проблема в том, что выводятся лишние строки “Документ не найден в базе”, то можно вынести else из цикла и добавить break если паспорт найден.

def get_owner():
    number = input('Введите номер документа: ')
    for dic in documents:
        if "number" in dic.keys() and dic["number"] == number:
            print('Владелец документа: ', dic['name'])
            break
    else: print('Документ не найден в базе')

Хотя я сам не понимаю, почему else продолжает при этом работать... Может кто подскажет?

Нашел.

Также в циклах while и for можно указать else-блок после основного блока цикла. else-блок в циклах выполняется один раз после завершения работы цикла, но только в случае, если цикл не был прерван инструкцией break. Поясним это на программе, которая по введенному целому числу n>1 определяет, является ли оно простым или составным.

 n=input("Введите целое число, больше 1 ") # 1 Считали число n
 for d in range(2, n):                     # 2 d меняется от 2 до n-1
     if n % d == 0:                        # 3 Проверка: n делится на d?
         print (n, "имеет делитель", d)   # 4
         break                             # 5 Завершаем цикл for
 else:                                     # 6 Это else-блок цикла
     print (n, "простое число")      # 7
→ Ссылка
Автор решения: Andrey Martynov

Одно из решений - счётчик успешных поисков, в этом случае меняем алгоритм проверки:

def get_owner():
  success_num = 0
  number = input('Введите номер документа:   ')
  for dic in documents:
    if 'number' in dic.keys() and dic['number'] == number:
      print('Владелец документа:       ', dic['name'])
      success_num += 1

  if success_num == 0:
    print('Документ не найден в базе')

get_owner()

Кроме того, break - приводит к прекращению выполнения цикла, если требуется лишь ограничить выполнение следующих команд цикла по условию - рекомендую использовать continue:

for i in range(10):
    if 7 > i > 4:
        continue
    print( i)
→ Ссылка