在Dict上使用循环来设置.setdefault创建嵌套字典

时间:2014-09-15 11:42:49

标签: python loops dictionary

我试图了解原因

tree = {}

def add_to_tree(root, value_string):
    """Given a string of characters `value_string`, create or update a
    series of dictionaries where the value at each level is a dictionary of
    the characters that have been seen following the current character.
    """
    for character in value_string:
        root = root.setdefault(character, {})

add_to_tree(tree, 'abc')

创建{'a': {'b': {'c': {}}}}

,而

root = {}

root.setdefault('a', {})
root.setdefault('b', {})
root.setdefault('c', {})

创建{'a': {}, 'b': {}, 'c': {}}

什么让我们在循环的每次迭代中进入指定的dict值?

2 个答案:

答案 0 :(得分:2)

如果root[character]character中的密钥,则

root.setdefault(character, {})会返回root,否则会返回空字典{}。它与root.get(character, {})相同,只是如果root[character] = {} character中的root尚未成为关键字,它还会指定root = root.setdefault(character, {})


root
如果character不是原始root中的密钥,则会将In [4]: root = dict() In [5]: newroot = root.setdefault('a', {}) In [6]: root Out[6]: {'a': {}} In [7]: newroot Out[7]: {} 重新分配给新的字典。

root.setdefault('a', {})

相反,使用root而不将其返回值重新分配给tree = {} def add_to_tree(root, value_string): """Given a string of characters `value_string`, create or update a series of dictionaries where the value at each level is a dictionary of the characters that have been seen following the current character. """ for character in value_string: root.setdefault(character, {}) add_to_tree(tree, 'abc') print(tree) # {'a': {}, 'c': {}, 'b': {}} 有效:

{{1}}

答案 1 :(得分:1)

对于任何和我一样慢的人。答案为"为什么(上面)函数产生{'a': {'b': {'c': {}, 'd': {}}}}而不产生{'a': {}, 'b': {}, 'c': {}}?"是:

因为我们在一个函数中循环并且每次都将结果重新分配给root,这有点像在他们一直说的电视广告中,“但是等等!还有更多!”。因此,当.setdefault在' a'上被调用时,在返回之前,结果是{'a': {}}被保持在{循环内},而它在' b'上运行收益{'b': {}},在{'a': {}}内并保持在一边并运行{'a': {}},然后整个事物从循环返回并应用于树。请注意,每次,.setdefault实际返回的内容都是默认值,在本例中为{}。以下是该过程的Python Visualizer插图。