19

数レベルの深さの辞書構造を作成しています。私は次のようなことをしようとしています:

dict = {}
dict['a']['b'] = True

現時点では、キー「a」が存在しないため、上記は失敗します。現時点では、ネストのすべてのレベルをチェックし、空の辞書を手動で挿入する必要があります。上記のようなことを行うことができるある種の構文糖衣はありますか?

{'a': {'b': True}}

ネストの各レベルで空の辞書を作成する必要はありませんか?

4

4 に答える 4

33

他の人が言ったように、を使用してdefaultdictください。これは、辞書の任意の深さのネストに対して私が好むイディオムです。

def nested_dict():
    return collections.defaultdict(nested_dict)

d = nested_dict()
d[1][2][3] = 'Hello, dictionary!'
print(d[1][2][3]) # Prints Hello, dictionary!

これにより、要素が存在するかどうかのチェックも少し良くなりますget

if not d[2][3][4][5]:
    print('That element is empty!')

これはpep8 準拠defのためにラムダではなくa を使用するように編集されています。元のラムダ形式は次のようになりましたが、適切な関数名を取得する代わりに、どこでも呼び出されるという欠点があります。<lambda>

>>> nested_dict = lambda: collections.defaultdict(nested_dict)
>>> d = nested_dict()
>>> d[1][2][3]
defaultdict(<function <lambda> at 0x037E7540>, {})
于 2013-05-23T22:28:26.557 に答える
0

dict()または、関数が処理できるので、これを行うことができます**kwargs:

http://docs.python.org/2/library/functions.html#func-dict

print dict(a=dict(b=True))
# {'a': {'b' : True}}
于 2013-05-23T22:24:53.477 に答える
0

データ構造の深さが固定されている場合 (つまり、 が必要であるが必要mydict[a][b][c]ではないことが事前にわかっている場合mydict[a][b][c][d])、式を使用してネストされた defaultdict 構造を構築しlambda、内部構造を作成できます。

two_level = defaultdict(dict)
three_level = defaultdict(lambda: defaultdict(dict))
four_level = defaultdict(lamda: defaultdict(lambda: defaultdict(dict)))
于 2013-05-23T22:30:40.847 に答える