2017-01-15 10 views
1

私はitertools.teeを使用して、辞書を生成するジェネレータのコピーを作成し、反復された辞書を、私が制御できない、辞書を修正する可能性のある関数に渡します。したがって、辞書のコピーを関数に渡したいと思いますが、すべてのティーは同じインスタンスへの参照のみを返します。itertools.tee()を反復要素のコピーを生成する方法は?

import itertools 

original_list = [{'a':0,'b':1}, {'a':1,'b':2}] 
tee1, tee2 = itertools.tee(original_list, 2) 

for d1, d2 in zip(tee1, tee2): 
    d1['a'] += 1 
    print(d1) 
    d2['a'] -= 1 
    print(d2) 

出力は次のとおりです:

この

は、次の簡単な例で説明される

{'b': 1, 'a': 1} 
{'b': 1, 'a': 0} 
{'b': 2, 'a': 2} 
{'b': 2, 'a': 1} 

私が持っていると思いますが:もちろん

{'b': 1, 'a': 1} 
{'b': 1, 'a': -1} 
{'b': 2, 'a': 2} 
{'b': 2, 'a': 0} 

、この中にたとえば、これを簡単に回避するにはさまざまな方法がありますが、具体的な使用例のために、 itertools.teeは、反復されたすべてのオブジェクトのコピーを、元のものを参照するのではなく、ティーのキューに格納します。

Pythonでこれを行う簡単な方法はありますか、または非ネイティブでitertools.teeを再実装する必要がありますか?

答えて

1

teeを再加工する必要はありません。ただ、map(dict, ...)発電機にteeによって生成された各発電機をラップ:あなたは反復として

try: 
    # use iterative map from Python 3 if this is Python 2 
    from future_builtins import map 
except ImportError: 
    pass 

tee1, tee2 = itertools.tee(original_list, 2) 
tee1, tee2 = map(dict, tee1), map(dict, tee2) 

これは、自動的に各辞書の簡易コピーを作成します。 (Pythonの3.6を使用して)

デモ:

>>> import itertools 
>>> original_list = [{'a':0,'b':1}, {'a':1,'b':2}] 
>>> tee1, tee2 = itertools.tee(original_list, 2) 
>>> tee1, tee2 = map(dict, tee1), map(dict, tee2) 
>>> for d1, d2 in zip(tee1, tee2): 
...  d1['a'] += 1 
...  print(d1) 
...  d2['a'] -= 1 
...  print(d2) 
... 
{'a': 1, 'b': 1} 
{'a': -1, 'b': 1} 
{'a': 2, 'b': 2} 
{'a': 0, 'b': 2} 
関連する問題