在Python中迭代字典时遇到问题

在Python中迭代字典时遇到问题,python,dictionary,Python,Dictionary,我定义了一个类词典: 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 a

我定义了一个类词典:

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
{}
>>> 

通常字典只有一种查找项目的方法,您所做的更适合元组

但因为我不知道你到底想做什么,这里有一个可能的解决方案:

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

代码所做的是循环字典中的每个条目(请记住,最初它是空的,因此不会发生任何事情),然后对于每个条目,如果键或值与输入不匹配,则将stem存储在
self.catDict[cat]
中。你看到问题了吗

事实上,有两个问题: 1.因为dictionary最初是空的,所以for循环在第一次本质上是一个no op,所以dictionary保持为空,add方法什么也不做。 2.即使您在字典中有一些内容,您也会在每次迭代中进行比较,因此基本上您要做的是添加条目,只要字典中至少有一个条目与您要添加的条目不同

但是,dict类已经提供了添加“仅当字典中不存在
'p':'John'
时”的条件。dict只有一个具有给定键的条目,因此如果执行
self.catDict['p']='John'
'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)

其工作方式是catDict是一个defaultdict,它是一个字典,如果试图访问以前未设置的键,它将调用传递给它的函数来构造一个新值。在add方法中,我们使用
sefl.catDict[cat]检索类别的值
如果我们已经为该类别存储了一些内容,将返回以前的集合,如果没有,将创建一个新集合并自动设置为
self.catDict[cat]
。然后我们将stem添加到该集合中。因为集合只包含不同的值,所以只有当stem尚未包含在集合中时,才会实际添加到集合中。

您是否尝试过测试dict中的键

if some_key not in self.catDict.keys()
    self.catDict[somekey] = someValue

问题的一部分在于,您只在条目已经存在的情况下添加条目。它不会填满。有点像先车后马,调用
iteritems
,但从来没有任何条目。如果已经存在一个密钥,您希望发生什么“是否有其他值?是要替换它,还是忽略新值?还是希望该值是一个名称列表?为什么还要检查
self.catDict[cat]=stem
总是替换,但这是无害的。。。。如果干是一根绳子。@willrobertshaw。。。你问了这个问题,然后就变黑了。为什么要问你是否打算走开呢?我想你的回答太过火了。OP还有一个悬而未决的问题,即如果尝试使用相同的键但使用不同的值,是否应阻止加法。@t如果存在键,则表示存在值。因此,任何其他添加都是不相关的,因为如果它相等,则该值已经存在,如果它不同,则我们不希望覆盖当前添加。如果它不同,则我们不希望覆盖当前添加。。。这就是OP想要澄清的。现在他说,如果键和值相同,就不要替换。你确定OP想要的就是这个吗?我的评论涵盖了这些案例,我正在等待OP对它们的看法。