Почему словарь по умолчанию в моем коде продолжает расширяться? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть словарь по умолчанию, и я запускаю его через несколько циклов, чтобы найти определенные строки в словаре.Циклы на самом деле ничего не добавляют к словарю, но, как выясняется, во время цикла новые элементы продолжают добавляться в словарь, и окончательный словарь заканчивается больше, чем исходный перед циклом.Я пытался определить эту ошибку навсегда, но сейчас уже поздно, и я не знаю, что вызвало это!

from collections import defaultdict
dummydict = defaultdict(list)    
dummydict['Alex'].append('Naomi and I love hotcakes')
dummydict['Benjamin'].append('Hayley and I hate hotcakes')
part = ['Alex', 'Benjamin', 'Hayley', 'Naomi']
emp = []
for var in dummydict:
    if 'I' in dummydict[var]:
        emp.append(var)
for car in part:
    for key in range(len(dummydict)):
        print('new len', len(dummydict))
        print(key, dummydict)
        if car in dummydict[key]:
            emp.append(car)
print(emp)
print('why are there new values in the dictionary?!', len(dummydict), dummydict)

Я ожидаю, что словарь останется неизменным.

Ответы [ 3 ]

2 голосов
/ 29 марта 2019
if car in dummydict[key]:

key, являющееся целым числом, и ваш dict изначально заполняется только строкой в ​​качестве ключей, это создаст новое значение в dummydict для каждого key.

1 голос
/ 29 марта 2019

См. документы :

Когда каждый ключ встречается в первый раз, он еще не находится в отображении;поэтому запись автоматически создается с использованием функции default_factory, которая возвращает пустой список.

Например, этот код покажет dummydict со значением в нем, потому что простой доступ к dummydict[key] добавит ключесли этот ключ еще не существует.

from collections import defaultdict
dummydict = defaultdict(list)    
dummydict[1]

print (dummydict)

выводит:

defaultdict(<class 'list'>, {1: []})

Ваша проблема в том, что в цикле вы делаете такие вещи, как dummydict[key] и dummydict[var], который добавляет эти ключи.

1 голос
/ 29 марта 2019

Доступ к отсутствующим ключам, как в dummydict[key], добавит эти ключи в defaultdict.Обратите внимание, что key - это int, а не значение в этой позиции, поскольку for key in range(len(dummydict)) выполняет итерации индексов, а не dict или его ключей.

...