在Python

时间:2015-12-02 04:19:09

标签: python dictionary

我已经定义了一个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
{}
>>> 

3 个答案:

答案 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

编辑:

我的猜测是你真正想要的是一种跟踪字典的方法,其中类别为键,词组为值。为此,setfrom 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