我想在嵌套字典中动态添加值。我试图用他们的词性标签来缓存两个单词的相似性得分。
简而言之,我想存储价值观;
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
分配一个列表(请注意它在类级别)。所以这段代码没有错误。
答案 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级别。 (参见:here和here。)
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
是类级别(即静态)。您的意思是这样的吗?