我定义了一个类词汇:
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
{}
>>>
发布于 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'
。
编辑:
我的猜测是,你真正想要的是一种以类别作为键和词干集作为值来跟踪字典的方法。为此,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添加到集合中。
发布于 2015-12-02 04:31:32
通常字典只有一种查找项目的方法,您所做的将更适合于元组。
但是,由于我不知道你到底想做什么,这里有一个可能的解决方案:
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
发布于 2015-12-02 19:04:57
你试过试着去测试那个小弟弟的钥匙了吗?
if some_key not in self.catDict.keys()
self.catDict[somekey] = someValue
https://stackoverflow.com/questions/34034861
复制相似问题