我有一个像这样的人物对象列表...
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项任务等)
我只是在寻找一种优雅的方式来存储这种格式的数据而迷失-例如只需将值附加到列表中,就会每月产生重复的条目,然后我需要清理,因此我希望有人建议使用一种数据结构来解决该问题。
答案 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