使用Python字典词典

时间:2015-10-17 20:08:59

标签: python dictionary

我有以下列表:

注意:我的实际列表包含许多元素,这只是我列表的一个子集

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]

如何修复此错误?

另外,我注意到,如果我在不运行循环的情况下手动创建字典结构,程序将正确运行。

2 个答案:

答案 0 :(得分:1)

你必须在inner循环中创建字典for,因为现在你总是分配相同的字典。

答案 1 :(得分:1)

您必须复制内部字典,否则您将在任何地方存储相同的引用。像这样:

size++;
if (size >= capacity)
{

这样您就可以创建内部数组的副本,而不仅仅是引用它