我正在开发一个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开发人员,对高级数据结构和课程缺乏经验,所以我感谢您提供的任何帮助。
答案 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中的线程支持,第二个可能在线程编程中特别有用。