首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中迭代字典有困难

在Python中迭代字典有困难
EN

Stack Overflow用户
提问于 2015-12-02 04:19:08
回答 3查看 62关注 0票数 0

我定义了一个类词汇:

代码语言:javascript
运行
复制
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“这样看起来就像这样:

代码语言:javascript
运行
复制
Lexicon.add("John","P")

我想把它存储在catDict字典中。但是,只有在字典中不存在'P':'John'的情况下,我的问题似乎出现在for循环和if语句中。

在没有for循环和if语句的情况下进行测试时,我的代码可以工作。但是,当我的代码中有for循环和if语句来过滤任何重复的条目时,它留给我的是一个空字典。下面是用for循环和if语句进行测试时的终端记录:

代码语言:javascript
运行
复制
>>> from statements import Lexicon
>>> lx = Lexicon()
>>> lx.catDict
{}
>>> lx.add("John","P")
>>> lx.catDict
{}
>>> 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-02 04:38:12

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

实际上有两个问题: 1.由于字典最初是空的,for循环本质上是第一次没有操作,所以字典保持为空,add方法什么也不做。2.即使字典中有某些内容,也可以对每一次迭代进行比较,因此,基本上,只要字典中至少有一个条目与所添加的条目不相同,您所要做的就是添加该条目。

但是,只在字典中不存在'P':'John'的情况下,dict类已经提供了这样的条件。dict只有一个带有给定键的条目,所以如果执行self.catDict['P'] = 'John''P':'John'已经在字典中,那么字典中仍然只有一个'P':'John'

编辑:

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

代码语言:javascript
运行
复制
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添加到集合中。

票数 1
EN

Stack Overflow用户

发布于 2015-12-02 04:31:32

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

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

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-12-02 19:04:57

你试过试着去测试那个小弟弟的钥匙了吗?

代码语言:javascript
运行
复制
if some_key not in self.catDict.keys()
    self.catDict[somekey] = someValue
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34034861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档