我有一个像这样的人物对象列表...
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 项任务)
我只是迷失在寻找一种优雅的方式来存储这种格式的数据 - 例如简单地将值附加到列表中会导致每月出现重复的条目,然后我必须随后清理这些条目,因此我希望有人可以推荐一种可以解决问题的数据结构。
最佳答案
我怀疑如果您使用字典来存储更多数据,这个问题会更容易解决。例如,不要输入 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
关于用于在元组中保存计数的Python数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53455316/