Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 05.04.2022
Сообщений: 19

Рекурсивный поиск в словаре

12.04.2022, 21:14. Показов 8245. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пользователь вводит искомый ключ. Также, если он хочет, то может ввести максимальную глубину, -это уровень, до которого будет просматриваться структура. Напишите функцию, которая находит заданный пользователем ключ в словаре и выдаёт значение этого ключа на экран. По умолчанию уровень не задан. В качестве примера можно использовать вот такой словарь:
Python
1
2
3
4
5
6
7
8
9
10
11
12
site = {
    'html': {
        'head': {
            'title': 'Мой сайт'
        },
        'body': {
            'h2': 'Здесь будет мой заголовок',
            'div': 'Тут, наверное, какой-то блок',
            'p': 'А вот здесь новый абзац'
        }
    }
}
Пример 1:
Python
1
2
3
Введите искомый ключ: head
Хотите ввести максимальную глубину? Y/N: n
Значение ключа: {'title': 'Мой сайт'}
Пример 2:
Python
1
2
3
4
Введите искомый ключ: head
Хотите ввести максимальную глубину? Y/N: y
Введите максимальную глубину: 1
Значение ключа: None
Добавлено через 1 час 18 минут
Python
1
2
3
4
5
6
7
8
9
def find_key(key, dict):
    if key in dict:
        return dict[key]
    for i in dict.values():
        return find_key(key, i)
 
 
key = input('Введите искомый ключ: ')
print(find_key(key, site))
1) При поиске в словаре 'body' выдает ошибку.
2) Не понимаю как задать глубину.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2022, 21:14
Ответы с готовыми решениями:

Поиск в словаре
def find_messages(self, user): '''Вывод всех сообщений конкретного участника в временной последовательности''' for k, v...

Поиск минимума в словаре
По условию задачи на вход приходит строка, например такая abc a bCd bC AbC BC BCD bcd ABC. Необходимо вывести самое частое слово в этом...

Поиск значения в словаре
Есть словарь, как найти путь к необходимому значению? Например: d = {'0': 0, '1': {'2': 2, '3' :{'4': 7}}} #Значение 2 d ...

4
18 / 14 / 5
Регистрация: 19.04.2020
Сообщений: 26
12.04.2022, 23:54
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def get_value(object: any, searched_key: str) -> any:
  if type(object) is not dict:
    return None
 
  if searched_key in object:
    return object.get(searched_key)
 
  for value in object.values():    
    if (result := get_value(value, searched_key)) is not None:
      break
  else:
    result = None   
 
  return result
Вот, над вложенностью сейчас подумаю

Добавлено через 12 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def get_value(object: any, searched_key: str, nested_value: int | None=None) -> any:
  if type(object) is not dict:
    return None
 
  if searched_key in object:
    return object.get(searched_key)
 
  if nested_value is not None and nested_value == 0:
    return None
 
  for value in object.values():
    if (result := get_value(
      value, 
      searched_key, 
      (nested_value-1 if nested_value is not None else None)
    )) is not None:
      break
  else:
    result = None
  return result
 
print(get_value(site, 'h2', 1))  # None
print(get_value(site, 'h2', 2))  # Здесь будет мой заголовок
или
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def get_value(object, searched_key, nested_value=None):
  if type(object) is not dict:
    return None
 
  if searched_key in object:
    return object.get(searched_key)
 
  if nested_value is not None and nested_value == 0:
    return None
 
  for value in object.values():
    if (result := get_value(
      value, 
      searched_key, 
      (nested_value-1 if nested_value is not None else None)
    )) is not None:
      break
  else:
    result = None
  return result
если версия python < 3.10
2
0 / 0 / 0
Регистрация: 05.04.2022
Сообщений: 19
13.04.2022, 08:23  [ТС]
Спасибо!!! А можешь подсказать как это с вводом с клавиатуры реализовать.
0
18 / 14 / 5
Регистрация: 19.04.2020
Сообщений: 26
13.04.2022, 10:24
Лучший ответ Сообщение было отмечено xFox как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
def enter():
  def get_value(object: any, searched_key: str, nested_value: int | None=None) -> any:
    if type(object) is not dict:
      return None
 
    if searched_key in object:
      return object.get(searched_key)
 
    if nested_value is not None and nested_value == 0:
      return None
 
    for value in object.values():
      if (result := get_value(
        value, 
        searched_key, 
        (nested_value-1 if nested_value is not None else None)
      )) is not None:
        break
    else:
      result = None
    return result
 
  def get_user_input(message: str) -> str:
    return input(message)
  
  def get_number() -> int:
    try:
      return int(get_user_input('Введите максимальную глубину: '))
    except ValueError:
      print('Введите число!')
      return get_number()
 
  site = {
    'html': {
      'head': {
          'title': 'Мой сайт'
      },
      'body': {
        'h2': 'Здесь будет мой заголовок',
        'div': 'Тут, наверное, какой-то блок',
        'p': 'А вот здесь новый абзац'
      }
    }
  }
 
  to_search = get_user_input('Введите искомый ключ: ')
  while (use_nested_value := get_user_input('Хотите ввести максимальную глубину? Y/N: ').lower()) not in 'yn':
    ...
    
  nested_value_input = get_number() if use_nested_value == 'y' else None
  print('Значение ключа: ', get_value(site, to_search, nested_value_input))
  
 
if __name__ == '__main__':
  enter()
2
0 / 0 / 0
Регистрация: 05.04.2022
Сообщений: 19
13.04.2022, 13:55  [ТС]
Огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2022, 13:55
Помогаю со студенческими работами здесь

Рекурсивный поиск и копирование найденных файлов
Всем привет! Нужна помощь по коду питона. Код должен искать файлы с расширением .jpeg на рабочем столе и копировать в отдельную папку. ...

Рекурсивный поиск файлов по маске + копирование
Доброго вечера. Имеется код, который выполняет рекурсивный поиск в каталоге С:\\MyFolder и подкаталогах по маске (расширению) файла. ...

Поиск в глубину (рекурсивный и не рекурсивный) и поиск в ширину, используя матрицу смежности
Реализуйте поиск в глубину (рекурсивный и не рекурсив- ный) и поиск в ширину, используя вместо списка смежно- сти, который мы...

Полнотекстовый поиск в словаре
Задача стоит следующая, необходимо создать словарь для множества локалей(рус,англ и т.д.) Словари будут храниться в БД. В общем случае,...

Поиск слова в словаре
Поиск слова в словаре. Все слова словаря хранятся в массиве. В отдельном текстовом поле вывести найденное слово и наиболее близкие к нему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru