我已经定义了一个Lexicon类:
class Lexicon:
"""stores known word stems of various part-of-speech categories"""
def __init__ (self):
self.catDict = {}
def add(self,stem,cat):
for k, v in self.catDict.iteritems():
if (k != cat and v != stem):
self.catDict[cat] = stem
当我执行Lexicon.add()
方法时,我希望它能说出一个例子,例如"约翰"和该词的类别,例如" P"所以看起来像这样:
Lexicon.add("John","P")
我希望将其存储在catDict
字典中。但是,只有在字典中不存在'P':'John'
时,我的问题似乎发生在for
循环和if
语句中。
在没有for
循环和if
语句的情况下进行测试时,我的代码可以运行。但是当我的代码中有for
循环和if
语句来过滤掉任何重复的条目时,它会留下一个空字典。当我使用for
循环和if
语句对其进行测试时,这是终端成绩单:
>>> from statements import Lexicon
>>> lx = Lexicon()
>>> lx.catDict
{}
>>> lx.add("John","P")
>>> lx.catDict
{}
>>>
答案 0 :(得分:1)
通常词典只有一种查找项目的方式,你正在做的事情会更适合一个元组。
但是因为我不知道你在这里想要做什么是一个可能的解决方案:
def add(self,stem,cat):
""" Only adds stem if cat is not present. """
if not cat in self.catDict: # the proper way to look up an item in a dict
self.catDict[cat] = stem
答案 1 :(得分:1)
你的代码所做的是循环遍历字典中的每个条目(请记住,最初它是空的,所以不会发生任何事情),然后对于每个条目,如果键或值没有&#39 ; t匹配您的输入,您将词干存储在self.catDict[cat]
中。你看到了问题吗?
实际上有两个问题: 1.由于字典最初是空的,for循环本质上是第一次的无操作,因此字典保持为空,并且add方法不执行任何操作。 2.即使您在字典中有某些内容,也可以对每次迭代进行比较,所以基本上你要做的就是添加条目,只要字典中至少有一个条目与字母不相同即可。你要添加的条目。
但是,只有在字典中没有'P':'John'
的情况下,才会添加它的条件,而dict类已经提供了self.catDict['P'] = 'John'
。 dict只有一个带有给定键的条目,所以如果你执行'P':'John'
并且'P':'John'
已经在字典中,你仍然只能在字典中有一个defaultdict
。
编辑:
我的猜测是你真正想要的是一种跟踪字典的方法,其中类别为键,词组为值。为此,set
和from collections import defaultdict
class Lexicon:
"""stores known word stems of various part-of-speech categories"""
def __init__ (self):
self.catDict = defaultdict(set)
def add(self,stem,cat):
self.catDict[cat].add(stem)
的组合是完美的:
sefl.catDict[cat]
这种方式的工作方式是catDict是一个defaultdict,它是一个字典,如果试图访问以前没有设置的密钥,它将调用传递给它的函数来构造一个新值。在add方法中,我们检索具有self.catDict[cat]
的类别的值,如果我们已经存储了该类别的内容,则将返回前一个集合,否则将创建一个新集合并自动设置为{{1} }。然后我们将词干添加到该集合中。因为集合只包含不同的值,所以只有当集合中尚未包含该集合时,才会实际将其添加到集合中。
答案 2 :(得分:0)
您是否尝试过测试dict中的密钥?
if some_key not in self.catDict.keys()
self.catDict[somekey] = someValue