在for循环中将动态字典附加到Python中的列表

在for循环中将动态字典附加到Python中的列表,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,这是实现问题前缀树的初始程序。后来我使用dict.copy()函数来处理字典的动态行为,但无法获得所需的输出 end='end' def make_trie(word,root): current_dict=root for letter in word: current_dict=current_dict.setdefault(letter,{}) current_dict[end]=end return root s=[] n=int(inp

这是实现问题前缀树的初始程序。后来我使用dict.copy()函数来处理字典的动态行为,但无法获得所需的输出

end='end'
def make_trie(word,root):
    current_dict=root
    for letter in word:
        current_dict=current_dict.setdefault(letter,{})
    current_dict[end]=end
    return root

s=[]
n=int(input())
t=[]
for _ in range(n):
    s.append(input())

    if  _==0:
        d=make_trie(s[-1],{})

    else:
        d=make_trie(s[-1],d)
    t.append(d.copy())
print(t)
我获取的输入列表:

4.
abcd
abce
abcdex
abcde

是:
“代码”><<代码>><{{{{{{{{{{{{{{}}}}}{{{{{}}}}{{{{}}}}}}{{{{{}}}}}}}{{{{}}}}}}{{{{}}}}}}}{{{}}}}}}}}}}}},,,}}}}}}}}}}}}}}}}}},,,,,,,,,,,,{AA a''''''''男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男:'end'},'end':'end'},'e':{'end':'end'},{'a':{'b':{'c':{'d':{'end':'end',e':{'x':{'end':'end'},'end':'end'},'e':{'end':'end'}]
这是最终词典的4倍。

请提供一些解决此问题的方法。

由于trie是一个字典字典,您需要深度复制而不是浅复制。请尝试以下方法:

from copy import deepcopy  

end='end'
def make_trie(word,root):
    current_dict=root
    for letter in word:
        current_dict=current_dict.setdefault(letter,{})
    current_dict[end]=end
    return root

s=[]
n=int(input())
t=[]
for _ in range(n):
    s.append(input())

    if  _==0:
        d=make_trie(s[-1],{})

    else:
        d=make_trie(s[-1],d)
    t.append(deepcopy(d))
print(t)  

浅层复制时,只需复制最外层的字典,因此内部字典仍在复制的字典之间共享。

另一个选项是,如果字典不是太大,使用Python 3的eval函数或内置ast库的函数literal\u eval,将字典对象强制转换为字符串并返回。您可以请尝试以下操作:

end='end'
def make_trie(word,root):
    current_dict=root
    for letter in word:
        current_dict=current_dict.setdefault(letter,{})
    current_dict[end]=end
    return root

s=[]
n=int(input())
t=[]
for _ in range(n):
    s.append(input())

    if  _==0:
        d=make_trie(s[-1],{})

    else:
        d=make_trie(s[-1],d)

    d_str = str(d)   
    t.append(eval(d_str))
print(t)