Добавить динамический словарь в список в Python в цикле for - PullRequest
0 голосов
/ 06 июня 2018

Это начальная программа для реализации дерева префиксов для вопроса.Позже я использовал функцию 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
is:
[{'a': {'b': {'c': {'d': {'end': 'end', 'e': {'x': {'end': 'end'}, 'end': 'end'}}, 'e': {'end': 'end'}}}}}, {'a': {'b': {'c': {'d': {'end': 'end', 'e': {'x': {'end': 'end'}, 'end': 'end'}}, 'e': {'end': 'end'}}}}}, {'a': {'b': {'c': {'d': {'end': 'end', 'e': {'x': {'end': 'end'}, 'end': 'end'}}, 'e': {'end': 'end'}}}}}, {'a': {'b': {'c': {'d': {'end': 'end', 'e': {'x': {'end': 'end'}, 'end': 'end'}}, 'e': {'end': 'end'}}}}}]
Это в 4 раза больше окончательного словаря.
Пожалуйста, предложите какой-нибудь способ решить эту проблему.

1 Ответ

0 голосов
/ 06 июня 2018

Поскольку это словарь словарей, вам нужно углубленное копирование вместо мелкого.Попробуйте это:

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)  

Когда вы копируете мелко, вы просто копируете самый внешний словарь, чтобы внутренние словари по-прежнему распределялись между скопированными словарями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...