Структура данных Python для хранения Count в кортежах? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть список таких людей, как этот ...

class person:
    monthlyTaskCount = [] 
    def __init__(self, name):
        self.name = name

bob = person("Bob Smith")
sam = person("Sam Jones")
amy = person("Amy Owen")

people = [bob,sam,amy]

И я сравниваю со списком задач, чтобы подсчитать и отследить, сколько задач они выполнили за месяц ...

for x in taskList: #contains x.personName, x.taskName, x.monthPerformed
    for p in people:
         if x.personName == p.name:
            #append to p.monthlyTaskCount in some way

Я застрял, потому что не могу визуализировать соответствующий способ отслеживания помесячных данных и в итоге получаю что-то подобное для p.amy.monthlyTaskCount ...

[11/2018:23, 12/2018:12, 1/2019:19, 2/2019:34]

(показаны 23 задачи, выполненные за ноябрь 2018 г. и т. Д.)

Я просто потерян в плане поиска элегантного способа хранения данных в этом формате - например, простое добавление значений в списокв результате получаются повторяющиеся записи в месяц, которые потом придется очищать, так что я надеюсь, что есть структура данных, которую кто-то может порекомендовать, которая решит проблему.

1 Ответ

0 голосов
/ 24 ноября 2018

Я подозреваю, что эту проблему было бы намного проще решить, если бы вы использовали словари для хранения большего количества ваших данных.Например, вместо того, чтобы помещать people в список, а только в словарь с указанием их имени, вы можете сразу искать соответствующий экземпляр person, вместо того чтобы каждый раз повторять список.

Аналогично, счет за месяц, вероятно, должен быть другим словарем, или, возможно, подтипом словаря, таким как collections.Counter (который специально предназначен для подсчета вещей).

Есть другая проблема с настройкойmonthlyTaskCount в вашем классе: все экземпляры будут иметь один и тот же список, поскольку он создается как переменная класса.Вероятно, вам следует перенести его создание в метод __init__, чтобы каждый person получил свою собственную копию.

В любом случае, вот мое предложение:

import collections

class person:
    def __init__(self, name):
        self.name = name
        monthlyTaskCount = collections.Counter()

bob = person("Bob Smith")
sam = person("Sam Jones")
amy = person("Amy Owen")

people = {p.name: p for p in [bob, sam, amy]}

С улучшенными структурами данных вашБухгалтерия становится легкой:

for x in taskList: #contains x.personName, x.taskName, x.monthPerformed
    people[x.personName].monthlyTaskCount[x.monthPerformed] += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...