Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 12, 2013 21:37:47

to_night
От: Киев
Зарегистрирован: 2013-12-12
Сообщения: 58
Репутация: +  1  -
Профиль   Отправить e-mail  

Некорректно сохраняются результаты обхода вложенных словарей в цикле for (поиск строки)

Добрый день. Написал следующий код для поиска вхождения строки в значении вложенного словаря. Совершается обход ключей и значений, данные сохраняются в пустой словарь. Непонятно, почему сохраняется только первое вхождение, остальное пропадает, тогда как инструкция print выводит все пары ключ: значение. Что не так?

search_string = 'Spam'
d = {1: {1: {'string': 'Spam', }, 2: {'string': 'Spam, Spam'},  3: {'string': 'Ham'}}}
dict_result = {}
 
for key, value in d.iteritems():
    for key1, value1 in d[key].iteritems():
        for key2, value2 in d[key][key1].iteritems():
            if search_string in str(value2):
                #print [key, key1, value2]
                #>>> [1, 1, 'Spam']
                #>>> [1, 2, 'Spam']
                dict_result.update({key: {key1: value2}})
 
print dict_result
>>> {1: {2: 'Spam'}}

Отредактировано to_night (Дек. 13, 2013 00:11:17)

Офлайн

#2 Дек. 12, 2013 22:22:02

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Некорректно сохраняются результаты обхода вложенных словарей в цикле for (поиск строки)

По Вашему вопросу:

search_string = 'Spam'
d = {1: {1: {'string': 'Spam'}, 2: {'string': 'Spam, Spam'}, 3: {'string': 'Ham'}}}
dict_result = {}
#
for key, value in d.iteritems():
    for key1, value1 in value.iteritems():
        for key2, value2 in value1.iteritems():
            if search_string in str(value2):
                dict_result.setdefault(key, {}).update({key1: value2})
print dict_result

Но, если количество вложений не известно, то лучше использовать рекурсию. Писать рекурсию для Вашего примера не буду, но посмотрите повнимательнее на этот код:

search_string = 'Spam'
d = {1: {1: {'string': 'Spam'}, 2: {'string': 'Spam, Spam'}, 3: {'string': 'Ham'}}}
dict_result = {}
#
def find_string(dict_):
    for data in dict_.itervalues():
        if type(data) is dict:
            find_string(data)
        else:
            print data
#
find_string(d)

Будут вопросы - пишите.

P.S. Все там работает корректно

Отредактировано 4kpt_II (Дек. 12, 2013 22:24:04)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version