2016-07-28 11 views
0

私は非常に大きな辞書の配列を持っており、それぞれの辞書自体を新しいキーの下に置く必要があります。Python、新しい属性でdict自体を移動する方法は?例えば、dict ['key'] = dict

私はdict['key'] = dictが動作しないことを知っており、Pythonで再帰的なdictが発生します。現在、私は次のようなことをしています:

new_dict['key'] = old_dict 

そしてそれはより良い方法ですか?

答えて

2

(またはあなたは、この特定の機能を必要とする理由に応じて動作してもしなくてもよい)dict自体に一定の番兵を置き換えるように、カスタム・ロジックのいくつかの並べ替えを書きます小さなビットからmgilsonの答えまで:

new_dict['key'] = old_dict 

はメモリの無駄ではありません。この代入演算子は、の参照番号のみをold_dictに割り当てます。 old_dictの要素はコピーされません。

しかし、どのように行うかに関係なく、直接または別の変数名を使用すると、いくつかの用途で有効であり、他のものでは有効ではない循環参照が得られます。

+0

完全に忘れられたオブジェクトは参照渡しされます。 – xlrtx

3

dict自分自身への参照を保持することができます。もちろん

>>> d = {'foo': 'bar'} 
>>> d['self'] = d 
>>> d 
{'self': {...}, 'foo': 'bar'} 
>>> d['self']['self']['self']['self']['foo'] 
'bar' 

、あなたが行うことができない一部ものがある(例えばjsonにそれをダンプ):

>>> import json 
>>> json.dumps(d) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in dumps 
    return _default_encoder.encode(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode 
    return _iterencode(o, 0) 
ValueError: Circular reference detected 

これを何らかの方法で永続化する必要がある場合は、それを自分自身に追加するときにコピーする以外の方法はありません。

d = {'foo': 'bar'} 
d['self'] = d.copy() 

または逆シリアル化するとき、あなたは追加

+0

返信いただきありがとうございますが、私はデータベース内のdictをダンプする必要があります。再帰的なdictは機能しません。 – xlrtx

関連する問題