为什么我的代码中的默认字典会不断扩展?

时间:2019-03-29 15:57:44

标签: python dictionary for-loop defaultdict

我有一个默认字典,我通过几个循环运行它以在字典中查找某些字符串。循环实际上并没有在字典中追加任何内容,事实证明,在循环过程中,新项不断添加到字典中,而最终的字典最终比循环前的原始字典大。 我一直在试图永远查明错误,但现在已经晚了,我不知道是什么原因造成的!

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 个答案:

答案 0 :(得分:2)

if car in dummydict[key]:

key是一个整数,并且您的字典最初仅用字符串作为键填充,这将在dummydict中为每个key创建一个新值。

答案 1 :(得分:1)

dummydict[key]那样访问丢失的密钥,会将这些密钥添加到defaultdict中。请注意,keyint,而不是该位置的值,因为for key in range(len(dummydict))迭代索引,而不是字典或其键。

答案 2 :(得分:1)

请参见docs

  

首次遇到每个键时,它尚未在映射中;因此,将使用default_factory函数自动创建一个条目,该函数将返回一个空列表。

例如,此代码将显示其中包含值的伪指令,因为如果该键尚不存在,只需访问dummydict[key]即可将该键添加到该指令中。

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

print (dummydict)

输出:

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

您的问题是,在循环中,您会执行dummydict[key]dummydict[var]之类的操作,从而添加了这些键。