Вывести словарь из списка по ключу

Помогите разобраться с кодом не получается вывести только Владелец документа: Аристарх Павлов

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 p():
  num = input("Введите номер документа:")
    for dic in documents:
        for key,value in dic.items():
            if key == "number" and value == num:
                print(dic["name"])
            elif key == "number" and value != num:
                print("Документ не найден в базе")
    
p()

введите сюда описание изображения

Помогите, пожалуйста с кодом Задание 1 Пункт 1. Пользователь по команде «p» может узнать владельца документа по его номеру. Примеры работы:

Введите команду: p

Введите номер документа: 10006 Результат: Владелец документа: Аристарх Павлов


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

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

Вы определитесь с циклами и их областями видимости. в вашем случае работать будет так:

def p():
    num = input("Введите номер документа:")
    for dic in documents:
        for key,value in dic.items():
            if key == "number" and value == num:
                return dic["name"]
    return "Документ не найден в базе"

print(p())
→ Ссылка
Автор решения: Vitalizzare

Внутренний цикл for key, value in dic.items(): ... вам не нужен, обращайтесь к номеру документа напрямую:

def print_owner_by_doc_number():
    owner = None
    num = input("Введите номер документа: ")
    for dic in documents: 
        if dic["number"] == num: 
            owner = dic["name"]
            break
    if owner is None:
        print(f'Документ №"{num}" в базе не найден')
    else:
        print(f'Владелец документа №"{num}": {owner}')


def main():
    help = '\n'.join([
        'Доступные комманды:',
        '   p - по номеру документа найти владельца',
        '   h - показать справочное сообщение',
        '   q - завершить работу'])
    print(help)
    while True:
        command = input('Введите команду: ')
        if command == 'p':
            print_owner_by_doc_number()
        elif command == 'h':
            print(help)
        elif command == 'q':
            break


main()

Если предполагается, что в базе может быть несколько разных документов с одним и тем же номером, тогда соберите их в список. Например:

num = ...
owners = [dic['name'] for dic in documents if dic['number'] == num]
→ Ссылка
Автор решения: Kseniya Sinickaya

Такой ответ уже есть, но если автор вопроса совсем новичок, перефразирую подробнее. ВАЖНО: если нет отладчика, всегда выводите командой print промежуточные значения или пользуйтесь отладчиком в IDE.

def p():
    num = input("Введите номер документа:")
    for dic in documents:
        for key,value in dic.items():
            if key == "number" and value == num:
                print(dic["name"])
                # нашли, значит выходим из функции и ни внешний,
                # ни внутренний
                # циклы не продолжаем
                return
    # Только в том случае, если все обошли и, действительно,
    # нету, пишем, что не нашли
    # а не каждый раз, когда значения не совпали
    print("Документ не найден в базе")
→ Ссылка
Автор решения: Swift - Friday Pie

Внутренний цикл не нужен, и скорее, вреден, т.к. имеет квадратичную сложность. Дело в том что цикл по словарю обходит каждый элемент словаря, т.е.

def p():
  num = input("Введите номер документа:")
  for dic in documents:
      for key,value in dic.items():
         print(key,value)

Выведет список всех пар ключ-значение

type passport
number 2207 876234
name Василий Гупкин
type invoice
number 11-2
name Геннадий Покемонов
type insurance
number 10006
name Аристарх Павлов

Т.е. в такой ситуации придется пометить запись в вложенном цикле чтобы по выходу из него вывести имя.

У словаря есть оператор [], возвращающий значение по ключу и работает он гораздо быстрее, используя оптимальный алгоритм для подобной структуры данных, тогда можно и просто имя сохранить

def p():
  num = input("Введите номер документа:")
  name = None;
  for dic in documents:
      if num == dic["number"]:
           name = dic["name"]
           break
           
  if name:
     print(name)

Естественно, в более сложных ситуациях вывод и поиск следует отделить друг от друга

→ Ссылка