我定义了一个类词典:
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()
方法时,我希望它接受一个单词,例如“John”,以及该单词的类别,例如“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
{}
>>>
通常字典只有一种查找项目的方法,您所做的更适合元组。你知道吗
但由于我不知道你到底想做什么,这里有一个可能的解决办法:
您的代码所做的是循环字典中的每个条目(请记住,最初它是空的,因此不会发生任何事情),然后对于每个条目,如果键或值与您的输入不匹配,则将stem存储在
self.catDict[cat]
。你看到问题了吗?你知道吗实际上有两个问题: 1由于dictionary最初是空的,for循环在第一次本质上是no op,因此dictionary保持为空,add方法不做任何操作。 2即使你在字典里有一些东西,你也会在每次迭代中进行比较,所以基本上你要做的就是添加条目,只要字典里至少有一个条目与你要添加的条目不同。你知道吗
但是,dict类已经提供了添加条件“仅当dictionary中不存在
'P':'John'
”。一个dict只有一个给定键的条目,因此如果执行self.catDict['P'] = 'John'
并且'P':'John'
已经在字典中,那么字典中仍然只有一个'P':'John'
。你知道吗编辑:
我的猜测是,您真正想要的是一种跟踪字典的方法,以类别作为键,以词干集作为值。为此,
defaultdict
和set
的组合是完美的:其工作方式是catDict是一个defaultdict,它是一个字典,如果试图访问以前没有设置的键,它将调用传递给它的函数来构造一个新值。在add方法中,我们使用
sefl.catDict[cat]
检索类别的值如果我们已经为该类别存储了一些内容,那么将返回上一个集合,如果没有,则将创建一个新集合并自动设置为self.catDict[cat]
。然后我们把茎加到那一组。因为集合只包含不同的值,所以只有在集合中尚未包含stem时,才会将其实际添加到集合中。你知道吗你试过测试字典里的钥匙吗?你知道吗
相关问题 更多 >
编程相关推荐