在Python中迭代字典有困难吗

2024-04-26 18:41:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了一个类词典:

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

Tags: ofselfaddforif字典def语句
3条回答

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

但由于我不知道你到底想做什么,这里有一个可能的解决办法:

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类已经提供了添加条件“仅当dictionary中不存在'P':'John'”。一个dict只有一个给定键的条目,因此如果执行self.catDict['P'] = 'John'并且'P':'John'已经在字典中,那么字典中仍然只有一个'P':'John'。你知道吗

编辑:

我的猜测是,您真正想要的是一种跟踪字典的方法,以类别作为键,以词干集作为值。为此,defaultdictset的组合是完美的:

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时,才会将其实际添加到集合中。你知道吗

你试过测试字典里的钥匙吗?你知道吗

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

相关问题 更多 >