Форум сайта python.su
0
Имеется словарь, который содержит значения ключей в виде:
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}
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)
Отредактировано latino2003 (Июнь 8, 2015 15:53:44)
Офлайн
857
>>> 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)
Офлайн
0
Спасибо!
Интересная конструкция assert. Если я правильно понял, это равносильно проверке if isinstance(dct, dict) или if type(dct) = dict?
Офлайн
857
latino2003assert - это утверждение, он (оператор) ставится там, где не должна произойти обратная ситуация. Ставится он временно как напоминание о том, что нужно сделать проверку и породить исключение в случае ошибки.
это равносильно проверке if isinstance(dct, dict)
Офлайн
0
Хм, а как вернуть значение из списка? Например, find(main_dict, u'Москва')
Если я правильно понимаю, то надо переделывать логику и делать на основе if type=dict … else?
Офлайн
857
latino2003Сначала нужно конкретно описать структуру: что может быть, чего не может быть.
а как вернуть значение из списка?
Офлайн
0
py.user.next
Сначала нужно конкретно описать структуру: что может быть, чего не может быть.
list1 = [] #пустой список list2 = ['a', 'b', 'c'] list3 = ['d', 'e', 'f'] dict1 = {key:list1, key:list2} dict2 = {key:dict1} dict3 = {key:list3}
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)
Офлайн
88
somedict[(key1, key2, key3)]
Офлайн
0
ShamanНе совсем понял вашу мысль.Не подойдёт?somedict[(key1, key2, key3)]
Офлайн
88
Мысль: использовать сложные ключи в едином словаре. Судя по описанию структуры там нет словарей в списках и она вырождается в многомерный слорварь.
Офлайн