Вывести словарь из списка по ключу
Помогите разобраться с кодом не получается вывести только Владелец документа: Аристарх Павлов
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 шт):
Вы определитесь с циклами и их областями видимости. в вашем случае работать будет так:
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())
Внутренний цикл 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]
Такой ответ уже есть, но если автор вопроса совсем новичок, перефразирую подробнее. ВАЖНО: если нет отладчика, всегда выводите командой 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("Документ не найден в базе")
Внутренний цикл не нужен, и скорее, вреден, т.к. имеет квадратичную сложность. Дело в том что цикл по словарю обходит каждый элемент словаря, т.е.
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)
Естественно, в более сложных ситуациях вывод и поиск следует отделить друг от друга
