Форум сайта python.su
0
ShamanВсе верно. Но сути вопроса это не меняет:
Судя по описанию структуры там нет словарей в списках и она вырождается в многомерный слорварь.
Офлайн
88
latino2003Меняет. Избавляемся от рекурсии, но там есть свои минусы в работе с иерархией. Если не нужно работать с конкретными уровнями, тогда, может, будет проще.
Все верно. Но сути вопроса это не меняет:
Офлайн
857
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)
Офлайн
0
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)
Офлайн
857
>>> 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'] >>>
Офлайн
0
Блин, вооот в чем проблема моей ошибки в использовании рекурсии - надо было разбить на две функции, а я голову сломал. Спасибо!
Офлайн
857
latino2003Это взаимно-рекурсивные функции: find() вызывает find_in_dict(), а find_in_dict() вызывает find().
надо было разбить на две функции
Офлайн