动态添加嵌套字典

时间:2014-10-09 02:51:01

标签: python python-2.7 dictionary

我想在嵌套字典中动态添加值。我试图用他们的词性标签来缓存两个单词的相似性得分。

简而言之,我想存储价值观;     synset_cache[word1][word1_tag][word2][word2_tag] = score

class MyClass(Object):

    def __init__(self):
        MyClass.synset_cache={} #dict

    def set_cache(self,word1, word1_tag, word2, word2_tag, score)
        try:
            MyClass.synset_cache[word1]
        except:
            MyClass.synset_cache[word1]={} #create new dict
        try:
            MyClass.synset_cache[word1][word1_tag]
        except:
            MyClass.synset_cache[word1][word1_tag]={} #create new dict
        try:
            MyClass.synset_cache[word1][word1_tag][word2]
        except:
            MyClass.synset_cache[word1][word1_tag][word2]={} #create new dict
        #store the value
        MyClass.synset_cache[word1][word1_tag][word2][word2_tag] = score

但我收到了这个错误。

Type error: list indices must be integers, not unicode

它显示的行号位于MyClass.synset_cache[word1][word1_tag]={} #create new dict

我怎样才能使这个工作?

修改 根据@Robᵩ对他回答的评论;我在另一个方法中为这个MyClass.synset_cache分配一个列表(请注意它在类级别)。所以这段代码没有错误。

2 个答案:

答案 0 :(得分:1)

使用dict.setdefault

这可能有效:

#UNTESTED
d = MyClass.synset_cache.setdefault(word1, {})
d = d.setdefault(word1_tag, {})
d = d.setdefault(word2, {})
d[word2_tag] = score

或者,你可以使用这个方便的递归defaultdict自动弹出新的dict级别。 (参见:herehere。)

import collections
def tree():
    return collections.defaultdict(tree)

class MyClass(Object):
    def __init__(self):
        MyClass.synset_cache=tree()

    def set_cache(self,word1, word1_tag, word2, word2_tag, score)
        MyClass.synset_cache[word1][word1_tag][word2][word2_tag] = score

答案 1 :(得分:0)

这将取决于数据,因为至少对于某些测试数据(见下文),代码不会产生该错误。你怎么称呼它?

另外,请注意,如上所述,由于某些语法错误(即没有冒号结束def set_cache行),它不会编译。

下面是一些调整到编译的代码,其中包含一些示例调用数据以及如何打印:

#!/usr/bin/env python

import pprint

class MyClass():

    def __init__(self):
        MyClass.synset_cache={} #dict

    def set_cache(self,word1, word1_tag, word2, word2_tag, score):
        try:
            MyClass.synset_cache[word1]
        except:
            MyClass.synset_cache[word1]={} #create new dict
        try:
            MyClass.synset_cache[word1][word1_tag]
        except:
            MyClass.synset_cache[word1][word1_tag]={} #create new dict
        try:
            MyClass.synset_cache[word1][word1_tag][word2]
        except:
            MyClass.synset_cache[word1][word1_tag][word2]={} #create new dict
        #store the value
        MyClass.synset_cache[word1][word1_tag][word2][word2_tag] = score


x = MyClass()

x.set_cache('foo', 'foo-tag', 'bar', 'bar-tag', 100)

pp = pprint.PrettyPrinter(indent=4)

pp.pprint(x.synset_cache)

哪个输出:

{   'foo': {   'foo-tag': {   'bar': {   'bar-tag': 100}}}}

其他一些值得注意的事情......

我建议使用in样式语法来检查密钥的存在,而不是try - except。它更紧凑,更Pythonic。

此外,您的主变量synset_cache是类级别(即静态)。您的意思是这样的吗?