Defaultdictを変換するにはどうすればよいですか
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
一般的な辞書になりますか?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
単にdict
を呼び出すことができます:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
しかし、defaultdict is dictであることを忘れないでください:
>>> isinstance(a, dict)
True
わずかに異なる動作で、欠落しているキーにアクセスしようとすると(通常はKeyError
が発生します)、代わりにdefault_factory
が呼び出されます。
>>> a.default_factory
<type 'list'>
これは、辞書のデータ側が表示される前にprint a
を表示したときに表示されるものです。
したがって、実際に新しいオブジェクトを作成せずに、より辞書的な動作を取り戻すためのもう1つのトリックは、default_factory
をリセットすることです。
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
しかし、ほとんどの場合、これはトラブルの価値はありません。
Defaultdictが再帰的に定義されている場合、たとえば:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
defaultdictをdictに戻すもう1つの簡単な方法は、json
モジュールを使用することです
import json
data = json.loads(json.dumps(data))
そしてもちろん、defaultdictに含まれる値はjsonがサポートするデータ型に限定する必要がありますが、dictにクラスや関数を保存するつもりがなければ問題になりません。
再帰defaultdict
をdict
に変換するための再帰バージョンが必要な場合は、次を試してください。
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)