2016-05-11 3 views
0

У меня есть ДИКТ, который содержит комбинацию dicts и списки, формат обычно выглядит следующим образом:обход через Словарь списков dicts

dict={ 
    category1: { 
     [{sub_cat1: [{item1:datetime1}, 
        {item2:val2} 
        ], 
      sub_cat2: 'some-string', 
      sub_cat3: some_int}, 
     {sub_cat1: [{item1:datetime3}, 
        {item2:val4} 
        ], 
      sub_cat2: 'some-string2', 
      sub_cat3: some_int2}, 
        . 
        . 
     ], 
    category2:{[]}, 
    category3:{[{some more stuff}]} 
    } 

Цель состоит в том, чтобы изменить объект DATETIME внутри самой низкой иерархии прямо в dict. Я могу написать гигантский цикл for, чтобы перебирать все, но я не знаю, есть ли более эффективный способ пройти через этот dict.

+0

Более эффективный с точки зрения производительности или количества кода? –

+0

Есть ли вопрос? – Charlie

+0

Возможно, вы захотите использовать рекурсивную функцию, которая принимает либо список, либо dict, и итерации через него, ища время, и если он находит список или dict, просто передает это обратно к рекурсивной функции. Надеюсь, у вас нет никаких круговых ссылок. –

ответ

3

обходе в произвольно вложенными итерируемыми, как правило, делается с помощью рекурсивной функции, такие, как это:

def change_datetime(new_datetime, dct): 
    temp = enumerate(dct) if isinstance(dct, list) else dct.items() 
    for index, i in : 
     if hasattr(i, "__iter__"): 
      change_datetime(new_datetime, i) 
     elif isinstance(i, datetime.datetime): 
      dct[index] = i 

По новому вызову change_datetime каждый раз, когда мы находим другую итерацию, мы можем проверить каждый список/Dict в иерархии.

+0

Кроме того, вы можете использовать модуль 'collections' для проверки« iterableness ». 'импортные коллекции; isinstance (i, collections.Iterable) '; хотя вы можете явно проверить списки/dicts, так как строки вернут true для «iterableness». –

+0

@BrendanAbel Я не хочу включать строки, но только другие контейнеры данных. – Natecat

+0

Да, это лаконично и хорошо работает! Спасибо за ваш ответ – JChao

Смежные вопросы