2016-10-31 2 views
0

Я извлек файл проекта MS в формате CSV. Его довольно большой (40 000 строк), и я пытаюсь создать скрипт Python, который может распечатать все задачи, предшествующие задаче/вехе/зависимости.Python MS Project Предшественник Recursion with for loop

Проблема связана с задачами, имеющими несколько предшественников. Я сохранил эти разделители на «~».

#Starting ID 
MSid = 80329 

#Subroutine FindPredesessors(MSid) 
def FindPred(MSid): 
#Get element[id] from the array     
    print(MSid) 
    #Predecessors of task 
    preds = arrMAX[MSid][1] 
    #List of split milestones 
    spID = spad.split('~') 

    #Attempt to loop through Function for each milestone in the split list 
    for h in range(len(spID)):   
     print(spID[h]) 
     print(h) 
     FindPred(int(spID[h])) 

FindPred(MSid) 

Лучшее, что я могу сделать, это следующий вывод

80329 
['80326', '83171'] 
['80324', '80432'] 
['80323'] 
'' 

я могу получить очень пути левой руки, но я не могу показаться, чтобы вернуться и петля функции через оставшуюся часть сплит-списки

+0

Вы наверняка столкнетесь с несколькими задачами предшественника несколько раз, поэтому сохраните идентификаторы, которые вы уже искали, и проверьте их перед тем, как выполнять каждый поиск. –

ответ

0

Похоже, вам нужен Breadth First Search. Идея такова:

  1. Установите необходимый идентификатор события в queue
  2. Пока очередь не пуста
    • прибудет() current идентификатора из него
    • положить все предшественник из current в очереди

Таким образом, вы посетите все предшественников выбранного события и всех их предшественников после этого и так далее.

#!/usr/bin/env python3 
from queue import Queue 

size = 6 
# in assumption you have devided strings to lists of ids 
# -1 means that event has no predecessor. 
preds = [[-1], [-1], [-1], [0], [1, 2], [3, 4]] 

def bfs(start): 
    """ Prints path of Depth first search given predecessors for all events""" 
    q = Queue() 
    q.put(start) 

    while not q.empty(): 
     current = q.get() 
     currentPreds = preds[current] 
     print(current, end=' ') 
     # or you can print them with predecessors 
     # print(currentId =', current, '| preds:', currentPreds) 

     for c in currentPreds: 
      if not visited[c] and c != -1: 
       q.put(c) 
    print() 

bfs(5) 
+0

Я пробовал это сейчас, и у меня получается аналогичный результат. Кажется, я не могу заставить функцию вернуться туда, где она должна была завершить цикл for. – codderz

+0

@codderz Я изменил ответ, надеюсь, теперь это будет полезно. Если вы ищете только версию рекурсии, проверьте Depth First Search, но для такой задачи вам это не нужно. – gasabr

+0

Это лучшее, что я до сих пор работаю. Спасибо. Но по какой-то причине, хотя я заменил все пустые поля на -1, я сижу, получая '' в списке и заканчивая ошибкой. – codderz