首页 > 解决方案 > 用于在元组中保持计数的 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 项任务)

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

标签: pythondata-structures

解决方案


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

推荐阅读