我有以下列表:
注意:我的实际列表包含许多元素,这只是我列表的一个子集
tags = ['DT', 'NN' , 'DT' , 'NN' , 'JJ', 'JJ' , 'NN', 'DT' , 'JJ' , 'DT' , 'NN']
Utags = set(tags)
然后,我使用以下代码创建了一个嵌套的Python字典。我使用以下代码创建嵌套字典结构的原因是因为其他尝试失败。给我错误:解压缩的值太多了。
transition = {x: {} for x in Utags}
inner = {x: float(1) for x in Utags}
for x in Utags:
transition[x] = inner
结果结构如下所示:
{'DT': {'DT': 1.0, 'JJ': 1.0, 'NN': 1.0},
'JJ': {'DT': 1.0, 'JJ': 1.0, 'NN': 1.0},
'NN': {'DT': 1.0, 'JJ': 1.0, 'NN': 1.0}}
现在我跑了一个循环,给了我意想不到的结果;我试图计算列表'标签'中的双字母组的数量。例如,计算“NN”的数量,然后列出“标签”中的“DT”,并将计数值存储在转换['DT'] ['NN']中。
我的循环:
for i in Utags:
for j in Utags:
for k in xrange(0, len(tags) - 1):
if((tags[k] == i) and (tags[k+1] == j)):
count += 1
transition[i][j] = count
count = 0
结果是:
{'DT': {'DT': 2, 'JJ': 2, 'NN': 2},
'JJ': {'DT': 2, 'JJ': 2, 'NN': 2},
'NN': {'DT': 2, 'JJ': 2, 'NN': 2}}
正在发生的事情是,计数值正在整个字典中填充,而不仅仅是
transition[i][j]
如何修复此错误?
另外,我注意到,如果我在不运行循环的情况下手动创建字典结构,程序将正确运行。
答案 0 :(得分:1)
你必须在inner
循环中创建字典for
,因为现在你总是分配相同的字典。
答案 1 :(得分:1)
您必须复制内部字典,否则您将在任何地方存储相同的引用。像这样:
size++;
if (size >= capacity)
{
这样您就可以创建内部数组的副本,而不仅仅是引用它