python - 用于在元组中保持计数的 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 项任务)
我只是迷失在寻找一种以这种格式存储数据的优雅方式 - 例如,简单地将值附加到列表会导致每月重复条目,然后我必须在之后清理,所以我希望有有人可以推荐的可以解决问题的数据结构。
解决方案
如果您使用字典来存储更多数据,我怀疑这个问题会更容易解决。例如,与其将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 - Numpy 从具有索引数组的二维数组中获取一维数组
- javascript - Reactjs:如何使用 JSZip 从 zip 文件中只获取一个文件?
- model - 在 Blender 中否定零件并错误导出
- python - 在 MQTT 中强制断开连接(触发最后遗嘱消息)
- django - DJANGO 3.1 'crispy_forms_tags' 不是注册标签库
- laravel-artisan - 安装 php artisan swagger 时出错:生成 Ubuntu
- android - Android 应用内购买有效订单但在 Google Play 商店中不存在
- javascript - Ngrx createReducer 从早期版本迁移
- sql - Redshift:Coalesce 无法按预期工作
- python - 是否可以矢量化 scipy Dirichlet PDF 函数?