- Создать вложенный словарь с помощью рекурсии Python
- 2 ответа
- Ещё вопросы
- Python-сообщество
- #1 Июнь 8, 2015 15:52:18
- Рекурсивный поиск по вложенным словарям
- #2 Июнь 8, 2015 16:15:28
- Рекурсивный поиск по вложенным словарям
- #3 Июнь 9, 2015 10:17:36
- Рекурсивный поиск по вложенным словарям
- #4 Июнь 9, 2015 10:52:12
- Рекурсивный поиск по вложенным словарям
- #5 Июль 13, 2015 17:36:37
- Рекурсивный поиск по вложенным словарям
- #6 Июль 14, 2015 11:22:17
- Рекурсивный поиск по вложенным словарям
- #7 Июль 14, 2015 11:47:52
- Рекурсивный поиск по вложенным словарям
Создать вложенный словарь с помощью рекурсии Python
Я пытаюсь оборачивать голову, как работает рекурсия, в частности, как вы можете разбить ее на части и работать над этим, сохраняя при этом, что все это принадлежит одной общей части, если это имеет какой-то смысл. Например, если мне присваивается список, например [1,2,3,4,5], и я хочу написать функцию, которая непрерывно создает словарь в словаре, причем каждый элемент в списке является ключом; вывод будет таким: <1: <2: <3: <4: <5: <>>>>>>. Я знаю, что это можно сделать с помощью простого цикла, но я хочу узнать, как работает рекурсия. Вот что я пробовал, и я знаю, что это, вероятно, довольно далеко. 🙁1:>
data = [1,2,3,4,5] split_order = dict() def split(data, split_order): if len(data) == 0: return split_order else: attr = data[0] new_data = data[1:] split_order[attr] = dict() split_order[attr] = split(new_data, split_order[attr])
2 ответа
Для понимания рекурсии сложно. Поэтому, чтобы сделать его немного проще, я упростил код (я удалил второй параметр, он вам не нужен):
def split(data): if len(data) == 0: return data #trivial case, we have no element therefore we return empty list else: #if we have elements first_value = data[0] #we take the first value data = #data[1:] will return a list with every value but the first value return data #this is called after the last recursion is called
Если вы вызываете его с помощью split[1,2,3,4,5] он возвращает <1: <2: <3: <4: <5: []>>>>> Посмотрим, что у нас есть. У нас есть та часть, которая нарушает рекурсию, ее часто называют якорем (по крайней мере, на моем языке). Мы просто проверяем, являются ли данные пустыми. Вы тоже сделали эту часть. Вторая часть будет извлекать первое значение и вызывать разделение, но с более коротким списком. Обычно эта часть будет работать над предоставленными данными, а затем называть себя. Это полезно, если данные (список) постоянно становятся меньше, так что якорь может быть вызван в будущем. Поэтому обычно вы удаляете один или несколько элементов. Если мы пройдем через код, мы увидим, что вызывает призыв. Если наш вход [1,2,3] мы называем: split([1,2,3]) → split([2,3]) → split([3]) → split() Только после последний вызов выполняется, мы начинаем возвращать значения (в этом порядке): [] → → <2: > → <1: <2:>>1:>
Небольшое примечание для интересующихся математикой, рекурсию можно сравнить с математической индукцией. Базовым корпусом является якорь, индукционная ступенька корпуса.
Вы ничего не возвращаете в своем предложении else . Вам также не нужно передавать split_order в вашу функцию:
def split(data): if data: head, *tail = data # This is a nicer way of doing head, tail = data[0], data[1:] return else: return <>
Ещё вопросы
- 1 Как узнать, когда выложена активность?
- 0 Выполнить очередь jQuery случайное количество раз
- 1 Выпадение между двумя слоями Conv и Batchnormalization
- 0 ngRoute решает проблему с инжектором
- 1 Начальная точка анимации прогресса шестиугольника D3 js
- 1 Объяснение ссылки на массив
- 1 В ролях KERAS Тензор к K.tf.int32
- 1 Каков иронический эквивалент необязательного оператора Yacc («?»)?
- 1 Масштабирование повернутого прямоугольника и поиск новых контрольных точек и центра
- 0 Передача вновь созданного объекта на другую страницу
- 0 ложный HTTP-ответ с обещаниями и возвращением фиктивных данных
- 1 Событие по щелчку в надстройке, созданной с помощью «yo office», вызывается для всех открытых документов
- 0 Можно ли при создании таблицы объявлять несколько столбцов одного типа без повторного упоминания типа?
- 1 Измените изображение Imageview за пределами просмотра повторного просмотра на элементе просмотра повторного просмотра
- 0 AngularJS / Javascript — Как я могу заменить весь объект на JSON
- 0 Загадочная проблема в моем PHP-скрипте
- 1 бритва PDF становится пустым в MVC4
- 1 Аутентификация веб-приложения для REST API Backend
- 1 JavaScript. Ссылка на переменную, которая создается динамически
- 0 Путаница с машинно-зависимыми значениями указателей
- 0 Получить текст всех вариантов выбора элементов?
- 1 Ярлык всегда отключен из-за ошибки «Приложение не установлено»
- 1 Как ссылаться на другой метод действия put в том же файле контроллера?
- 1 Как разделить список с «-» в качестве разделителя, при этом строка содержит «-»?
- 0 Qt отсутствует библиотека?
- 0 JQuery переходы страницы
- 1 Как я могу получить свой GET-запрос залпа на возврат информации из незащищенного протокола?
- 3 Интеллидж андроид проект. Gradle 5.2.1. Причина: java.util.ConcurrentModificationException
- 0 JQuery — пытается перейти к разделам с той же ссылкой
- 1 Добавление текста в FarPoint при экспорте в Excel
- 0 Что приводит к слишком много соединений в MySQL
- 0 Почему я не могу загрузить значения базы данных в мой список?
- 1 Функция клиента чата Twilio Android getSubscribeedChannels () возвращает неполные каналы
- 0 Codeigniter- Экспорт в CSV Проблемы
- 1 Показать страницу ошибки при сбое приложения из-за необработанного исключения
- 1 Как закрыть полноэкранную рекламу, не нажимая кнопку закрытия?
- 1 Пропустить конвертацию сущностей при загрузке строки yaml (используя PyYAML)
- 1 ArrayList в Arraylist удалить метод поведения
- 1 Приложения Сценарии авторизации OAuth2 с использованием гэппи из HtmlService
- 1 Python DataFrame — выбор строк данных на основе значений в другом кадре данных
- 0 XAMPP PHP файл работает, но нет результата?
- 0 Как разместить значок / изображение слева от ссылки, используя CSS-спрайты?
- 1 Asp.Net MVC, WebApi и правильный асинхронный подход
- 1 Поддержка векторной регрессии (SVR) не отображает граф в Ubuntu 18.04 LTS
- 0 AngularJS, проблемы с переменной $ index в ng-repeat
- 1 Как сохранить параметры для xtraReport с набором данных в качестве источника данных
- 0 Учитывая 2D массив, конвертировать в Z-порядок
- 0 Математические случайные числа от 50 до 80
- 1 Какие версии Android NDK поддерживают 64-разрядные архитектуры?
- 0 Как мне сопоставить динамический маршрут в базе данных?
Python-сообщество
- Начало
- » Python для новичков
- » Рекурсивный поиск по вложенным словарям
#1 Июнь 8, 2015 15:52:18
Рекурсивный поиск по вложенным словарям
Имеется словарь, который содержит значения ключей в виде:
1. словари
2. списки
info = [u'no', u'информацьион'] address = [u'Москва', u'Верхние поля', u'18а'] phones = [] vasya = u'информация':info, u'адрес':address, u'телефоны':phones> prot = [] base = [u'ground'] part = [1, 2, 3] fedya = u'протокол':prot, u'база':base, u'партия':part> mila = [u'abc', u'безнадега', u'точка ру'] main_dict = u'вася пупкин':vasya, u'федя негров':fedya, u'мила йовович':mila>
Задача:
пройтись рекурсивно по словарю, найти ключ равный match_key и вернуть его значения.
def recursive(data, match_key): if type(data) == dict: for key, value in sorted(data.items()): if key == match_key: return key else: return recursive(value, match_key)
Но функция не работает:
print recursive(main_dict, u’телефоны’) -> None
Отредактировано latino2003 (Июнь 8, 2015 15:53:44)
#2 Июнь 8, 2015 16:15:28
Рекурсивный поиск по вложенным словарям
>>> info = [u'no', u'информацьион'] >>> address = [u'Москва', u'Верхние поля', u'18а'] >>> phones = ['ph1', 'ph2'] >>> vasya = u'информация':info, . u'адрес':address, . u'телефоны':phones> >>> >>> prot = [] >>> base = [u'ground'] >>> part = [1, 2, 3] >>> fedya = u'протокол':prot, . u'база':base, . u'партия':part> >>> >>> mila = [u'abc', u'безнадега', u'точка ру'] >>> main_dict = u'вася пупкин':vasya, . u'федя негров':fedya, . u'мила йовович':mila> >>> >>> def find(dct, key): . assert isinstance(dct, dict) . if key in dct: . return dct[key] . else: . for i in dct.values(): . if isinstance(i, dict): . out = find(i, key) . if out is not None: . return out . . >>> find(main_dict, u'телефоны') ['ph1', 'ph2'] >>> find(main_dict, u'x') >>>
Отредактировано py.user.next (Июнь 8, 2015 16:27:18)
#3 Июнь 9, 2015 10:17:36
Рекурсивный поиск по вложенным словарям
Спасибо!
Интересная конструкция assert. Если я правильно понял, это равносильно проверке if isinstance(dct, dict) или if type(dct) = dict?
#4 Июнь 9, 2015 10:52:12
Рекурсивный поиск по вложенным словарям
assert — это утверждение, он (оператор) ставится там, где не должна произойти обратная ситуация. Ставится он временно как напоминание о том, что нужно сделать проверку и породить исключение в случае ошибки.
(Если, например, будет подан список, то поиск может найти в нём ключ, хотя объект не подходит для поиска.)
Проверка через isinstance() от проверки через type() отличается тем, что isinstance() сработает также в случае, если тип порождён от dict.
#5 Июль 13, 2015 17:36:37
Рекурсивный поиск по вложенным словарям
Хм, а как вернуть значение из списка? Например, find(main_dict, u’Москва’)
Если я правильно понимаю, то надо переделывать логику и делать на основе if type=dict … else?
#6 Июль 14, 2015 11:22:17
Рекурсивный поиск по вложенным словарям
#7 Июль 14, 2015 11:47:52
Рекурсивный поиск по вложенным словарям
Структура данных состоит из двух типов — словарь и список.
Значение словарей могут быть как списком, так и другим словарем. Списки всегда одномерные.
list1 = [] #пустой список list2 = ['a', 'b', 'c'] list3 = ['d', 'e', 'f'] dict1 = key:list1, key:list2> dict2 = key:dict1> dict3 = key:list3>
Словарь
… не может быть пустым.
… может содержать в качестве значений только список или словарь (в виде переменной)
Список
… может быть пустым
… не может быть многомерным
PS Для чего выбрана такая структура. Имеются данные, разбитые по категориям:
1. Основная категория 1 1.1 Субкатегория 1 1.1.1 Субсубкатегория 1 1.1.2 Субсубкатегория 2 1.1.3 Субсубкатегория 3 1.2 Субкатегория 2 1.3 Субкатегория 3 2. Основная категория 2 3. Основная категория 3 4. Основная категория 4
Количество подкатегорий может изменяться со временем как в большую, так и в меньшую стороны. Последняя подкатегория всегда является списком.
Отредактировано latino2003 (Июль 14, 2015 11:54:03)