2012-03-16 5 views
1

私は、文字列、リスト、およびその他の辞書で構成される複雑なデータを保持するパラメータ辞書を持っています。今私はこのデータを繰り返し処理したいと思う。リストと二項の両方のイテレータ。

私の問題は、リストと辞書の両方を繰り返すイテレータを持つための方法です。これは非常にpythonish見えない

def parse_data(key, value): 
    iterator = None 

    if isinstance(value, dict): 
     iterator = value.items() 
    elif isinstance(value, list): 
     iterator = enumerate(value) 

    if iterator is not None: 
     for key, item in iterator: 
      parse_data(key, item) 
     return 

    # do some cool stuff with the rest 

:私は何を持っている

。私はiterのような関数を考えて、キーとアイテムの両方を繰り返し処理する可能性を与えました。

希望すると助かります。
アドバイスをいただきありがとうございます。

+1

あなたのやり方に悪いことはありません。 –

+0

@CharlesBrunet私は、私がまだ知らないすべてのものを短縮するための典型的なpythonish悪いお尻のトリックを考えました。 – Johnny

答えて

0

私はこれがかなりpythonicだと思います。そこにそれを行うための簡単な方法ですが、Pythonのは一つのこと、さまざまな方法を実行するために構築されている場合

def parse_data: 

    if isinstance(value, dict): 
     iterator = value.items() 
    elif isinstance(value, list): 
     iterator = enumerate(value) 
    else: 
     return 

    for key, item in iterator: 
     parse_data(value, key, item) 

    # do some cool stuff with the rest 
+0

これで、 '残りの人といくつかのクールなことをする'は決して呼び出されません。 – Johnny

+0

何ですか?もちろん。ただ早すぎる 'return'は、' value'が不適切なタイプのものである場合にのみ起きます。 –

+0

私のコードでこのコメントを書いた私のアイデアは、文字列など他のタイプの値を扱う場所に署名することでした。これは、あまりにも複雑な条件付き構造を持たないように初期化するために 'iterator = None'を使用した理由です。とにかくそれであなたの権利。 – Johnny

0

イムわからない:私はちょうどそれを変更します。これは別の方法かもしれません。私はそれが動作しないようにそれをテストしていない。

def parse_data(key,value): 
    iterator = isinstance(value,dict) 

    if iterator is False and isinstance(value,list): 
     iterator = enumerate(value) 

    if iterator is not None: 
     for key,item in iterator: 
      parse_data(key,item) 
     return  

    #do some cool stuff with the rest 
+0

私は自分の質問を編集しました。 'parse_data'の引数を忘れてしまいました。自分の問題を示すためにスタンドアロンの機能を使用しました。 – Johnny

+0

私は自分のコードを変更しましたが、そのコードはそれほど短くはありませんでしたが、それを行う方法が異なる可能性があります。 – amlane86

+0

有望そうです。それをテストします。 – Johnny

関連する問題