2016-05-07 10 views
0

辞書をループして、{'a':[1,2]、 'b':を入力すると、 3}、{'a':1、 'b':3}、{'a':2、 'b':3}を取得したい。Pythonでジェネレータを使用して辞書をループする

私は再帰的に働くだろうジェネレータを書き込もうとしました:

def loop_dic(dic, head={}): 

    if len(dic) == 0: 
     yield head 

    k = dic.keys()[0] 
    vals = dic[k] 
    dic.pop(k) 
    if not hasattr(vals, '__iter__'): 
     vals = [vals] 

    for v in vals: 
     _head = head.copy() 
     _head.update({k:v}) 
     loop_dic(dic, _head) 

が、それはGeneratorExitにつれて、それは、動作しません。最初の再帰呼び出しでなし。 これを行う方法は?

+1

あなたは降伏from' 'に覚えていましたか? –

+0

私は 'yield from'を使ったことがなく、Python 2.7を使っています。 – graham

+0

これはまた、 'dic'を破壊的に修正して、ジェネレータが使い果たされるまでに空になるようにします。それは本当にあなたが望むものですか?ジェネレータが反復処理中のオブジェクトを破壊するのは非常に異常です。 –

答えて

2

あなたがしたのはloop_dic()です。あなたはそれで何もしなかった。 Pythonの3では、あなただけ行うことができます:Pythonの2で

 yield from loop_dic(dic, _head) 

を、あなたはループを必要とする:

 for item in loop_dic(dic, _head): 
      yield item 
+0

ありがとうございます。 '_dic = dic.copy()'と 'yield head'の後ろに' return'を加えた後で動作します。 – graham

関連する問題