Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2015 12:24:36

latino2003
Зарегистрирован: 2015-05-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Shaman
Судя по описанию структуры там нет словарей в списках и она вырождается в многомерный слорварь.
Все верно. Но сути вопроса это не меняет:
пройтись рекурсивно по словарю и
1. найти ключ равный match_key и вернуть его значения
2. найти элемент списка по части значения(найти элемент “Москва” по запросу “оскв”)

Офлайн

#2 Июль 14, 2015 12:53:31

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

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

latino2003
Все верно. Но сути вопроса это не меняет:
Меняет. Избавляемся от рекурсии, но там есть свои минусы в работе с иерархией. Если не нужно работать с конкретными уровнями, тогда, может, будет проще.

Офлайн

#3 Июль 14, 2015 12:58:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

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

latino2003
Структура данных состоит из двух типов - словарь и список.

Напиши, что возвращает каждый вызов:
f(['a', 'b', 'c'], 'a')
 
f({'a': ['b', 'c']}, 'a')
 
f({'a': ['b', 'c']}, 'c')
 
f({'a': {'b': []}}, 'b')

Напиши, являются ли эти вызовы валидными:
f({'a': 'b'}, 'a')
 
f([{'a': 'b'}], 'a')
 
f({'a': {'b': 'c'}}, 'b')
 
f({'a': {'b': 'c'}}, 'c')



Отредактировано py.user.next (Июль 14, 2015 13:00:15)

Офлайн

#4 Июль 14, 2015 14:41:54

latino2003
Зарегистрирован: 2015-05-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

py.user.next
Напиши, что возвращает каждый вызов:
f(['a', 'b', 'c'], 'a') -> 'a'
f({'a': ['b', 'c']}, 'a') -> (key,values) = ('a', 'b', 'c')
f({'a': ['b', 'c']}, 'c') -> 'c'
f({'a': {'b': []}}, 'b') -> (key,values) = ('b') 

Напиши, являются ли эти вызовы валидными:
f({'a': 'b'}, 'a') #значением словаря может быть только список или словарь
f([{'a': 'b'}], 'a') #список может содержать только юникод-элементы
f({'a': {'b': 'c'}}, 'b') #значением словаря может быть только список или словарь
f({'a': {'b': 'c'}}, 'c') #значением словаря может быть только список или словарь
Все вызовы невалидны, так как:
словари могут содержать в качестве значений только список или словарь
списки не могут быть многомерным и содержат только юникод-элементы -
['a', 'b', 'c']

Отредактировано latino2003 (Июль 14, 2015 16:21:31)

Офлайн

#5 Июль 15, 2015 00:38:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

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

>>> def find_in_list(lst, key):
...     assert isinstance(lst, list)
...     if key in lst:
...         return key
... 
>>> def find_in_dict(dct, key):
...     assert isinstance(dct, dict)
...     if key in dct:
...         return [key] + dct[key]
...     else:
...         for i in dct.values():
...             out = find(i, key)
...             if out is not None:
...                 return out    
... 
>>> def find(cont, key):
...     if isinstance(cont, list):
...         return find_in_list(cont, key)
...     elif isinstance(cont, dict):
...         return find_in_dict(cont, key)
... 
>>> 
>>> 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}
>>> 
>>> find(main_dict, u'телефоны')
['телефоны', 'ph1', 'ph2']
>>>



Офлайн

#6 Июль 15, 2015 09:34:09

latino2003
Зарегистрирован: 2015-05-25
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Блин, вооот в чем проблема моей ошибки в использовании рекурсии - надо было разбить на две функции, а я голову сломал. Спасибо!

Офлайн

#7 Июль 15, 2015 09:44:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

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

latino2003
надо было разбить на две функции
Это взаимно-рекурсивные функции: find() вызывает find_in_dict(), а find_in_dict() вызывает find().



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version