単語のリストがあり、ネストされた辞書に保存したいと思います。
サンプルリストは次のとおりです。
words = ['Apple','Ape','Bark','Barn']
作成したい辞書は次のとおりです。
{'A':{'P':{'E':{},
'P':{'L':{'E':{}}}}},
'B':{'A':{'R':{'K':{},'N':{}}}}}
単語は大文字と小文字を区別しません。
単語のリストがあり、ネストされた辞書に保存したいと思います。
サンプルリストは次のとおりです。
words = ['Apple','Ape','Bark','Barn']
作成したい辞書は次のとおりです。
{'A':{'P':{'E':{},
'P':{'L':{'E':{}}}}},
'B':{'A':{'R':{'K':{},'N':{}}}}}
単語は大文字と小文字を区別しません。
collections.defaultdict()
代わりにオブジェクトを使用してください:
from collections import defaultdict
def tree():
return defaultdict(tree)
nested = defaultdict(tree)
for word in words:
node = nested
for char in word:
node = node[char.upper()]
defaultdict
まだ存在しない内のキーにアクセスしようとすると、そのキーの値を透過的に生成するためにデフォルト ファクトリが呼び出されます。上記のコードでは、デフォルトのファクトリはであり、同じファクトリを持つ別tree()
のファクトリを生成し、キーにアクセスするだけでネストされた辞書のセットを構築できます。 defaultdict()
デモ:
>>> from collections import defaultdict
>>> def tree():
... return defaultdict(tree)
...
>>> nested = defaultdict(tree)
>>> words = ['Apple','Ape','Bark','Barn']
>>> for word in words:
... node = nested
... for char in word:
... node = node[char.upper()]
...
>>> nested
defaultdict(<function tree at 0x114e62320>, {'A': defaultdict(<function tree at 0x114e62320>, {'P': defaultdict(<function tree at 0x114e62320>, {'P': defaultdict(<function tree at 0x114e62320>, {'L': defaultdict(<function tree at 0x114e62320>, {'E': defaultdict(<function tree at 0x114e62320>, {})})}), 'E': defaultdict(<function tree at 0x114e62320>, {})})}), 'B': defaultdict(<function tree at 0x114e62320>, {'A': defaultdict(<function tree at 0x114e62320>, {'R': defaultdict(<function tree at 0x114e62320>, {'K': defaultdict(<function tree at 0x114e62320>, {}), 'N': defaultdict(<function tree at 0x114e62320>, {})})})})})
>>> def print_nested(d, indent=0):
... for k, v in d.iteritems():
... print '{}{!r}:'.format(indent * ' ', k)
... print_nested(v, indent + 1)
...
>>> print_nested(nested)
'A':
'P':
'P':
'L':
'E':
'E':
'B':
'A':
'R':
'K':
'N':
Adefaultdict
は標準の Python ディクショナリのサブクラスであり、キーの値を自動的に具体化することを除けば、通常のディクショナリとまったく同じように動作します。