用于在元组中保存计数的Python数据结构?

标签 python data-structures

我有一个像这样的人物对象列表...

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/

相关文章:

python - 过滤掉Python列表中重复的字符串化算术运算的最佳方法?

python - 在一个共享对象中 boost python 多个模块

postgresql - Sails.js 在数组中搜索

python - 如何选择列表中多次出现的任意数量的元素?

python - 在 python 中替代 c++ STD::map(需要快速的 lower_bound 方法)

algorithm - 打印给定未排序数组 A[] 中大于 x 的最小元素的程序

python - 围绕 Python 函数制作 Cython 包装器

python - 消息类型 websocket gdax (coinbase)

python - 可以跳过其 block 的 with 语句

java - 使用字符串并在添加节点时遇到问题的二叉树