+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何在Python中从用户定义的类创建集合

发布于2020-06-06 06:31     阅读(1180)     评论(0)     点赞(10)     收藏(2)


让我在python中有以下课程:

class Word:
def __init__(self, _lemma, _frequency):
    self.lemma = str(_lemma)
    self.frequency = int(_frequency) 

现在我想创建一个类的集合,Word当将一个Word对象word1添加到集合时,该集合具有以下逻辑

  • 如果集合包含一个Word对象wordword.lemma = word1.lemma那么word.frequency = word.frequency + word1.frequency
  • 否则添加word1到收藏夹

我该怎么做?


以前我用一个列表,这样做在那里我检查如果列表中包含一个Word具有相同的对象lemmaword1.lemma但是该方法具有O(n ^ 2)的复杂度,需要word在集合中添加n

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

解决方案


您的措辞可能会使熟悉Python的社区成员感到困惑。我认为您将“字典”一词用作域模型的一部分,而不是Python中的数据结构。

如果确实需要WordCorpus类,则应该继续执行以下代码:

from collections import defaultdict


class Word:

    def __init__(self, lemma: str, frequency: int):
        self.lemma = lemma
        self.frequency = frequency

    def __eq__(self, other):
        return self.lemma == other.lemma

   def __hash__(self):
       return hash(self.lemma)


class Corpus:

    def __init__(self):
        self.words = defaultdict(0)

    def add(self, word: Word):
        self.words[word] += word.frequency

关键点是:

  1. 类型提示的用法
  2. dict查找(例如'b' in {'a': 23, 'b': 24}如何工作- 何时使用hash()调用__eq__?
  3. defaultdict 用法
  4. __eq____hash__用法

并且我强烈建议您考虑一下是否真的要在中存储Word实例Corpus



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/409296/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)