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

2024-04-25 21:53:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的人和物的清单。。。你知道吗

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项任务等)

我只是在寻找一种优雅的方式来存储这种格式的数据方面迷失了方向-例如,简单地将值附加到列表中会导致每月重复的条目,然后我必须在之后进行清理,所以我希望有人可以推荐一种数据结构来解决这个问题。你知道吗


Tags: 数据nameinself列表forsamdef
1条回答
网友
1楼 · 发布于 2024-04-25 21:53:23

我怀疑如果你使用字典来存储更多的数据,这个问题会更容易解决。例如,不是将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

相关问题 更多 >