defaultdictを変換するにはどうすればよいですか
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
一般的な口述になるには?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
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は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
しかし、ほとんどの場合、これは問題の価値がありません。
default_factory
ください。何が起こっているのか全く分かりません。ごめんなさい。
default_factory
-これはdefaultdict
、defaultdict(int)
またはのように、最初にを作成したときに渡した関数ですdefaultdict(list)
。a['3']
たとえば、通常の辞書のように、辞書でキーを検索しようとすると、値を取得するか、KeyError
例外が発生します(エラーなど、そのキーが見つからなかったことを通知します)。しかし中にdefaultdict
は、代わりに呼び出すdefault_factory
ための関数を作る(で「デフォルト」の新しいデフォルト値をdefaultdict
あなたのため)。
defaultdictが再帰的に定義されている場合、次に例を示します。
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
defaultdictをdictに戻すさらに別の簡単な方法は、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)
defaultdict(lambda: defaultdict(int))
)、簡潔です。 {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)