2016-05-11 12 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

リストやディクショナリのいずれかを受け取り、それを繰り返す繰り返し関数を使い、リストやディクテーションを見つけたらそれを再帰関数に返すだけです。うまくいけば、循環参照はありません。 –

答えて

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 

新しいコールすることによって、我々は別のiterableを見つけるたびにchange_datetimeし、我々は、各リスト/ dictのを確認することができます階層。

+0

また、 'collections'モジュールを使って" iterableness "をテストすることができます。 'コレクションをインポートする。 isinstance(i、collections.Iterable) ';しかし、文字列は "iterableness"に対してもtrueを返すので、明示的にlist/dictsをチェックしたいかもしれません。 –

+0

@BrendanAbel私は文字列を含めたくない、ちょうど他のデータコンテナ。 – Natecat

+0

はい、これは簡潔であり、うまくいきます!あなたの答えをありがとう – JChao

関連する問題