Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python中的用户定义类创建集合_Python_List_Dictionary_Collections - Fatal编程技术网

如何从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

让我用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.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%保持不变,只存储引理的字符串表示