2017-02-27 7 views
3

辞書/リストの各項目に対していくつかの機能を実行したい。私はこれをやってみたが、期待した結果が得られなかった。ここにコードがあります。このためdictの各メンバーのdict iterator関数を呼び出す

class GroupDict(dict): 
def iteritems(self): 
    # do some operation for every member in dict 
    print "in __iter__" 
    return super(GroupDict, self).iteritems() 
a = GroupDict() 
a['a'] = 0 
a['b'] = 1 
for key in a.iteritems(): 
    print key 

私は出力

in __iter__ ('a', 0) ('b', 1)

を取得しかし、期待していますと、

in __iter__ ('a', 0) in __iter__ ('b', 1)

私はforループ内で操作を行うにはしたくないですが、私は何を言及しますクラスのすべてのメンバーに実行する必要があります。これで私を助けてください。

+0

これを実現するために、なぜあなたはフォームdictを継承し、iteritemsをオーバーライドするのですか?単に 'for k、vをa.iteritems():f(k、v)'とすると、あなたが望む関数f forループで操作を実行すると何が問題になりますか? –

+0

このコードをforループ内に追加することはできません。コードが構造化されているために部分的に追加されています.2番目に、そのルートがなくなったら多くの変更が必要です。 – shrishinde

答えて

2

iteritems()は、ループが実際に開始する前に一度だけ呼び出されます。

なぜか見てみましょう。あなたはすべてのメンバーのために何かをしたい場合は、あなたがやりたいことが容易である

it = iter(EXP) 
while True: 
    try: 
     x = next(it) 
    except StopIteration: 
     break 
    do_something() 

iteritems()からINGのyieldによって::このループ:

def iteritems(self): 
    for k, v in super(GroupDict, self).iteritems(): 
     print "doing something with %s/%s" % (k,v) 
     yield k, v 

for x in EXP: 
    do_something() 

は大雑把に変換します

+0

も同様に__iter__メソッドをラップしようとしましたが、これは一度だけ呼び出されます。だから、どのメソッドがdict-iteratorを意味しますか? – shrishinde

+0

@ShriShindeはい、 'next'(Python 2では' Python 3の '__next__')をオーバーライドする必要があります。 –

+0

@ShriShinde独自の* iteratorクラス*を定義し、Python2の '__next __()'メソッド( 'next()')で必要な処理を行い、 'iteritems()'をオーバーライドして独自のイテレータを返す必要があります。もっと簡単なオプションは 'iteritems()'を 'yield'を使ってジェネレータにすることです。私はそれを私の答えに追加します – shx2

関連する問題