用于保持元组计数的Python数据结构?

时间:2018-11-24 05:03:52

标签: python data-structures

我有一个像这样的人物对象列表...

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]

(显示2018年11月完成的23项任务等)

我只是在寻找一种优雅的方式来存储这种格式的数据而迷失-例如只需将值附加到列表中,就会每月产生重复的条目,然后我需要清理,因此我希望有人建议使用一种数据结构来解决该问题。

1 个答案:

答案 0 :(得分:2)

我怀疑如果您使用字典来存储更多数据,则可以轻松解决此问题。例如,不是将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