web-dev-qa-db-ja.com

Python:defaultdictをdictに変換

Defaultdictを変換するにはどうすればよいですか

number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})

一般的な辞書になりますか?

{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
69
user2988464

単に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

しかし、ほとんどの場合、これはトラブルの価値はありません。

95
DSM

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にクラスや関数を保存するつもりがなければ問題になりません。

22
Meow

再帰defaultdictdictに変換するための再帰バージョンが必要な場合は、次を試してください。

#! /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)
9
white_gecko