Python3: группировка списка объектов по словам в описании - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть стандартный список объектов, где каждый объект определен как

class MyRecord(object):

  def __init__(self, name, date, category, memo):
      self.name = name 
      self.date = date
      self.category = category 
      self.memo = memo.strip().split()

Когда я создаю объект, обычно вводная заметка представляет собой длинное предложение, например: «Привет, мир, это новыйfunny-memo ", которая затем в функции init превращается в список ['Hello', 'world', 'is', 'a', 'new', 'funny-memo'].

Учитывая, скажем, 10000 таких записей в списке (с разными заметками), я хочу сгруппировать их (как можно быстрее) следующим образом:

'Hello' : [all the records, which memo contains word 'Hello']
'world' : [all the records, which memo contains word 'world']
'is' : [all the records, which memo contains word 'is']

Я знаю, какиспользовать group-by для группировки записей, например, по имени, дате или категории (поскольку это одно значение), но у меня проблема с группировкой, как описано выше.

1 Ответ

0 голосов
/ 17 сентября 2018

Если вы хотите сгруппировать их очень быстро, вы должны сделать это один раз и никогда не пересчитывать. Чтобы достичь этого, вы можете попробовать подход, используемый для кеширования, это групповые объекты при создании:

class MyRecord():

    __groups = dict()

    def __init__(self, name, date, category, memo):
        self.name = name
        self.date = date
        self.category = category
        self.memo = memo.strip().split()
        for word in self.memo:
            self.__groups.setdefault(word, set()).add(self)

    @classmethod
    def get_groups(cls):
        return cls.__groups


records = list()
for line in [
        'Hello world this is a new funny-memo',
        'Hello world this was a new funny-memo',
        'Hey world this is a new funny-memo']:
    records.append(MyRecord(1, 1, 1, line))


print({key: len(val) for key, val in MyRecord.get_groups().items()})

Выход:

{'Hello': 2, 'world': 3, 'this': 3, 'is': 2, 'a': 3, 'new': 3, 'funny-memo': 3, 'was': 1, 'Hey': 1}
...