Python - эффективная группировка данных - PullRequest
0 голосов
/ 15 апреля 2019

Представьте, что существует около 200 групповых пресетов.К каждой группе прикреплено X номеров «предметов».Группа может иметь один элемент или 100 элементов.Группы часто имеют элементы с общими именами, т.е.Group_0040 может иметь item_abcde, item_bcda, item_bcba и Group_0120 может иметь общий item_abcd, но 10 других, которые не используются совместно с Group_0040.

Какой самый эффективный способ сортировки списков X # В группах больше всего элементовобщего?Я полагаю, в идеале, в конце концов, данные, которые было бы полезно вернуть, были бы:

  • Сортировано из МОСТ общего с наименьшим общим
  • Список групп, в которых есть эти элементыобщие
  • Имена элементов.

, то есть наиболее общие могут выглядеть следующим образом:

[{'groups': [<Group_0040>, <Group_0041>, <Group_0022, <Group_0076>, <Group_0054>, <Group_0192>, <Group_0017>],
  'items': [<Item_acdb>, <Item_ddbc>, <Item_dddb>, <Item_cbcb>, <Item_acba>, <Item_aaba>]
  }
  ....
]

Сбор этих данных также будет иметь значения отсечения - т.е.должно быть X общих групп, и должно быть X общих элементов, чтобы их можно было рассмотреть.т.е.:

getSharedItemGroups (minGroups = 4, minItems = 5)

Пример:

class Group(object):
def __init__(self, name):

    self.name = name
    self.items = []

    def addItem(self, item):
        self.items.append(item)

class Item(object):
    def __init__(self, name):       
        self.name = name

import random
import string

groups = []
for x in range(200):
    groups.append(Group('Group_{0:04d}'.format(x)))

letters = string.lowercase
for group in groups:
    for i in range(random.randint(0,50)):
        tag = ''
        for c in range(4):
            tag += letters[random.randint(4)]
        group.addItem(Item('item_' + tag)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...