6

単語のリストがあり、ネストされた辞書に保存したいと思います。

サンプルリストは次のとおりです。

words = ['Apple','Ape','Bark','Barn']

作成したい辞書は次のとおりです。

{'A':{'P':{'E':{},
           'P':{'L':{'E':{}}}}},
 'B':{'A':{'R':{'K':{},'N':{}}}}}

単語は大文字と小文字を区別しません。

4

1 に答える 1

7

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 ディクショナリのサブクラスであり、キーの値を自動的に具体化することを除けば、通常のディクショナリとまったく同じように動作します。

于 2013-10-20T01:54:25.157 に答える