2016-11-28 2 views
0

처음에는 Emacs org-mode 및 todo.txt와 같이 다른 할일 형식의 목록간에 작업을 동기화하는 Python 프로그램을 개발 중입니다. 중앙 집중화 된 형식으로 작업을 추적하기 위해 사용해야하는 데이터 구조가 무엇인지 (또는 이것이 최선의 방법인지 여부는 확실하지 않습니다.)다른 형식으로 작업 목록을 동기화하기위한 데이터 구조

첫 번째 시도는 키가 작업 목록의 원래 줄인 각 작업 속성의 사전을 만들고 그 값은 관련 속성의 문자열입니다.

#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 

그때, 가장 최근에 업데이트 된 두 개의 텍스트 파일의 어떤 확인 가장 최근의 파일에서 변경 작업을 당겨 및 이전 파일에 이러한 작업을 덮어 예를 들어, 나는 다음에 대한 사전 있었다. 두 목록 중 하나의 새 작업이 다른 목록에 추가됩니다. 또한 작업은 모두 중앙 집중식 파일에 저장됩니다. 헤더는 작업의 속성 (task_name, 노력, 우선 순위, 최종 기한, 예정된 날짜, todo_state, 태그 등)이고 각 행은 CSV/탭으로 구분 된 값 파일입니다. 작업입니다.

그런 다음 각 속성이 특성이고 각 작업이 일련의 사전 대신 Task 개체의 인스턴스 인 "작업"이라는 개체 클래스를 대신 만들어야 할 수도 있습니다.

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

또는 나는 SQLite 데이터베이스의 작업을 넣을 수 : 이런 식으로 뭔가를 -

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

마지막으로, 내가 중첩 된 사전 또는 JSON 형식을 사용할 수 있습니다 나에게 발생했습니다.

어떤 접근 방식이 가장 좋습니까? 아니면 이보다 나은 접근 방식이 있습니까? 필자는 고급 데이터 구조 및 클래스에 대한 경험이 거의없는 중급 Python 개발자이므로 제공 할 수있는 도움에 감사드립니다.

답변

1

이 경우 데이터 구조로 우선 순위 큐가 적합해야합니다. 파이썬에서 구현하는 방법은 적어도 두 가지가 있습니다.

첫번째는 Heap 데이터 구조에 기초하고

here에서 가져


    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') 

로서 설명 될 수있다.

두 번째 방법은 파이썬 2에서 인 Queue 모듈을 사용하는 것입니다.이 모듈에는 요구 사항을 충족시킬 수있는 클래스 PriorityQueue이 들어 있습니다.

첫 번째 것은 수정하기 쉽고 유연한 것으로 간주 될 수 있지만 두 번째 것은 Python의 스레드 지원으로 인해 스레드 프로그래밍에 특히 유용 할 수 있습니다.

관련 문제