为单词python创建嵌套字典

为单词python创建嵌套字典,python,data-structures,python-3.x,Python,Data Structures,Python 3.x,我有一个单词列表,我想将它们存储在嵌套字典中 以下是示例列表:- words = ['Apple','Ape','Bark','Barn'] 我要创建的字典如下所示:- {'A':{'P':{'E':{}, 'P':{'L':{'E':{}}}}}, 'B':{'A':{'R':{'K':{},'N':{}}}}} 单词不区分大小写。请改用对象: from collections import defaultdict def tree(): return d

我有一个单词列表,我想将它们存储在嵌套字典中

以下是示例列表:-

words = ['Apple','Ape','Bark','Barn']
我要创建的字典如下所示:-

{'A':{'P':{'E':{},
           'P':{'L':{'E':{}}}}},
 'B':{'A':{'R':{'K':{},'N':{}}}}}
单词不区分大小写。

请改用对象:

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()
,允许您仅通过访问键来构建一组嵌套字典

演示:

>>从集合导入defaultdict
>>>def tree():
...     返回defaultdict(树)
... 
>>>嵌套=默认dict(树)
>>>单词=[‘苹果’、‘猿’、‘树皮’、‘谷仓’]
>>>用文字表示:
...     节点=嵌套
...     对于word中的字符:
...         node=node[char.upper()]
... 
>>>嵌套
defaultdict(,{'A':defaultdict(,{'P':defaultdict(,{'P':defaultdict(,{})}),'E':defaultdict(,{})}),'B':defaultdict(,{'A':defaultdict(,{'R':defaultdict(,{'K':defaultdict(,{}),'N':defaultdict(,{})})})
>>>def打印_嵌套(d,缩进=0):
...     对于k,v在d.iteritems()中:
...         打印“{}{!r}:”。格式(缩进*“”,k)
...         嵌套打印(v,缩进+1)
... 
>>>打印嵌套(嵌套)
“A”:
“P”:
“P”:
“L”:
“E”:
“E”:
“B”:
“A”:
“R”:
“K”:
“N”:

defaultdict
是标准Python字典的一个子类,除了自动实现键的值外,其行为与常规字典完全相同。

所以您想创建一个?耶,我不知道这是一个trie。感谢您在这方面的帮助。如果您能告诉我一种有效的方法来遍历这个,我也会很感激,这样我就可以检查一些类似于以“bar”开头的单词;有关示例,请参见和。
>>> 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':