如何从Python中的用户定义类创建集合
让我用python创建以下类:如何从Python中的用户定义类创建集合,python,list,dictionary,collections,Python,List,Dictionary,Collections,让我用python创建以下类: class Word: def __init__(self, _lemma, _frequency): self.lemma = str(_lemma) self.frequency = int(_frequency) 现在,我想创建一个类Word集合,在将Word对象word1添加到集合中时,该集合包含以下逻辑: 如果集合包含Word对象Word,其中Word.lemma=word1.lemma,则Word.frequency=Word.fr
class Word:
def __init__(self, _lemma, _frequency):
self.lemma = str(_lemma)
self.frequency = int(_frequency)
现在,我想创建一个类Word集合,在将Word对象word1添加到集合中时,该集合包含以下逻辑:
如果集合包含Word对象Word,其中Word.lemma=word1.lemma,则Word.frequency=Word.frequency+word1.frequency
否则将word1添加到集合中
我怎么做
之前,我使用了一个列表来检查列表中是否包含与word1.lemma具有相同引理的Word对象。但是,在集合中添加n个单词的方法具有^2复杂性
from Word import Word
class Corpus:
def __init__(self, _name, _total_count):
self.name = str(_name)
self.total_count = int(_total_count)
self.words = []
def add(self, _word):
find_word = [index for index, word in enumerate(self.words) if word.lemma == _word.lemma] # O(n)
if len(find_word) == 0:
self.words.append(Word(_word.lemma, _word.frequency))
else:
self.words[find_word[0]].frequency = self.words[find_word[0]].frequency + _word.frequency
通过使用字典而不是列表,使用单词.lemma作为键,您可以轻松完成此任务:
def add(self, _word):
if _word.lemma not in self.words:
self.words[_word.lemma] = _word
else:
self.words[_word.lemma].frequency += _word.frequency
一个不方便的地方是它复制了引理信息
如果不强制使用Word类,则可以使用默认值为0的,仅将频率值与引理键关联的:
class Corpus:
def __init__(...):
...
self.words = defaultdict(lambda: 0)
def add(self, lemma, frequency):
self.words[lemma] += frequency
通过使用字典而不是列表,使用单词.lemma作为键,您可以轻松完成此任务:
def add(self, _word):
if _word.lemma not in self.words:
self.words[_word.lemma] = _word
else:
self.words[_word.lemma].frequency += _word.frequency
一个不方便的地方是它复制了引理信息
如果不强制使用Word类,则可以使用默认值为0的,仅将频率值与引理键关联的:
class Corpus:
def __init__(...):
...
self.words = defaultdict(lambda: 0)
def add(self, lemma, frequency):
self.words[lemma] += frequency
您的措辞可能会使熟悉Python的社区成员感到困惑。我认为您正在使用字典术语作为域模型的一部分,而不是Python中的数据结构 如果您真的需要Word和Corpus类,您应该继续编写如下代码: 从集合导入defaultdict 类词: 定义初始自我,引理:str,频率:int: self.lemma=引理 self.frequency=频率 定义自身,其他: 返回self.lemma==other.lemma 定义散列自身: 返回hashself.lemma 类语料库: 定义初始自我: self.words=defaultdict0 def addself,word:word: self.words[word]+=word.frequency 重点是: 使用 dict查找,例如{'a':23,'b':24}中的'b'是如何工作的- 用法 用法
我强烈建议您考虑是否真的想在语料库中存储单词实例。您的措辞可能会让熟悉Python的社区成员感到困惑。我认为您正在使用字典术语作为域模型的一部分,而不是Python中的数据结构 如果您真的需要Word和Corpus类,您应该继续编写如下代码: 从集合导入defaultdict 类词: 定义初始自我,引理:str,频率:int: self.lemma=引理 self.frequency=频率 定义自身,其他: 返回self.lemma==other.lemma 定义散列自身: 返回hashself.lemma 类语料库: 定义初始自我: self.words=defaultdict0 def addself,word:word: self.words[word]+=word.frequency 重点是: 使用 dict查找,例如{'a':23,'b':24}中的'b'是如何工作的- 用法 用法
我强烈建议您考虑是否真的想在语料库中存储单词实例。为什么您的self.words是一个列表,而您想要一本词典?您的方法已经过时了complexity@Sanyash你说得对。“语料库.添加复杂性”处于启用状态。我修正了代码中的注释。但是我想说的是,添加n个单词的复杂性在^2。为什么你的self.words是一个列表,而你想要一本字典?你的方法有很多complexity@Sanyash你说得对。“语料库.添加复杂性”处于启用状态。我修正了代码中的注释。但是我想说的是,复杂性是在^2上加n个单词。是的。我可以省略在语料库中存储单词实例。我可以使用Tryph展示的方法,比如使用默认值为0的defaultdict,将频率值与引理键相关联。但你能解释一下为什么你要我重新考虑在语料库中存储单词实例吗?存储单词实例的方法可以让你在频率累积背后封装更复杂的逻辑,例如,假设小写和大写单词相等,并保持高内聚性。但是,如果您可以只存储单词的总和,并区分大小写,为什么不只存储单词的字符串表示形式呢;dr-如果您计划使算法更复杂,请存储单词实例;如果100%保持不变,只存储引理的字符串表示。我可以省略在语料库中存储单词实例。我可以使用Tryph展示的方法,比如使用默认值为0的defaultdict,将频率值与引理键相关联。但你能解释一下为什么你要我重新考虑在语料库中存储单词实例吗?存储单词实例的方法可以让你在频率累积背后封装更复杂的逻辑,例如,假设小写和大写单词相等,并保持高内聚性。但是,如果您可以只存储单词的总和,并区分大小写,为什么不只存储单词的字符串表示形式呢;dr-如果您计划进行algor,请存储单词实例 它更复杂;如果100%保持不变,只存储引理的字符串表示