用于以不同格式同步任务列表的数据结构

时间:2016-11-28 23:34:19

标签: python sqlite data-structures org-mode

我正在开发一个Python程序,用于在不同待办事项格式的列表之间同步任务 - 最初是Emacs org-mode和todo.txt。我不确定我应该使用什么数据结构来集中跟踪任务(或者这是否是最好的方法)。

我的第一次尝试是创建每个任务属性的字典,其中键是任务列表中的原始行,值是相关属性的字符串。例如,我有以下字典:

#org-mode format

task_name["TODO [#C] Take out the trash"] = "Take out the trash" 
priority["TODO [#C] Take out the trash"] = "C"

#todo.txt format

effort["(A) Refill Starbucks card @10min"] = 20 # meaning 20 minutes of estimated time

然后检查最近更新了两个文本文件中的哪一个,从最新文件中提取已更改的任务,并在旧文件上覆盖这些任务。任一列表中的新任务都会添加到另一个列表中。这些任务也都存储在一个集中文件中:CSV /制表符分隔值文件,其中标题是任务的属性(task_name,努力,优先级,截止日期,scheduled_date,todo_state,标签等),每行是一项任务。

然后我想到也许我应该创建一个名为“Task”的对象类,其中每个属性都是一个属性,每个任务都是Task对象的一个​​实例而不是一系列字典。

class Task(object):
    def __init__(self, name, effort, priority):
        name = self.name
        effort = self.effort
        priority = self.priority

最后,我想到我可能想要使用嵌套字典或JSON格式 - 就像这样:

{line: "TODO [#C] Take out the trash" {
        "task_name": "Take out the trash."
        "priority": "C"
        "todo_state": "TODO"
        }}

或者我可以将任务放在SQLite数据库中。

哪种方法最好,还是有另一种方法比所有方法都好?我是一名中级Python开发人员,对高级数据结构和课程缺乏经验,所以我感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

作为数据结构的优先级队列应该适合这种情况。 至少有两种方法可以在Python中实现它。

第一个基于Heap数据结构,可以描述为



    pq = []                         # list of entries arranged in a heap
    entry_finder = {}               # mapping of tasks to entries
    REMOVED = ''      # placeholder for a removed task
    counter = itertools.count()     # unique sequence count

    def add_task(task, priority=0):
        'Add a new task or update the priority of an existing task'
        if task in entry_finder:
            remove_task(task)
        count = next(counter)
        entry = [priority, count, task]
        entry_finder[task] = entry
        heappush(pq, entry)

    def remove_task(task):
        'Mark an existing task as REMOVED.  Raise KeyError if not found.'
        entry = entry_finder.pop(task)
        entry[-1] = REMOVED

    def pop_task():
        'Remove and return the lowest priority task. Raise KeyError if empty.'
        while pq:
            priority, count, task = heappop(pq)
            if task is not REMOVED:
                del entry_finder[task]
                return task
        raise KeyError('pop from an empty priority queue')

取自here

第二种方法是在Python 2中使用Queue模块,在Python 3中为queue。该模块包含一个可以满足您要求的类PriorityQueue

第一个可能被认为是更简单和灵活的修改,但由于Python中的线程支持,第二个可能在线程编程中特别有用。