2016-11-28 88 views
0

我正在開發一個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

作爲數據結構的優先級隊列應該適合這種情況。 至少有兩種方法可以在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中使用模塊,該模塊爲Python 3中的queue。此模塊包含一個類PriorityQueue,可以滿足您的要求。

第一個可能被認爲對修改更直接和靈活,但第二個可能因爲Python中的線程支持而在線程化編程中特別有用。