2017-02-04 10 views
1

Это короткий фрагмент из моего кода при решении проблемы this. Я хочу перетаскивать элементы в список в стек, но одно и то же имя элемента следует использовать в качестве имени списка при переходе на функцию run. Мое намерение - это что-то близкое к глубине, первый поиск и базовый случай, чтобы остановить рекурсию, скоро будут включены в мой код. Есть ли способ для cast элемент, который нужно принять за аргумент имени списка.Передача имени элемента списка в качестве типа списка для функции

#Below is dependency list 
p1-['p2','p3'] 
p2=['p3','p4'] 
p3=['p4'] 
p4=[] 
p5=[] 

def run(pro=[]) 
    if pro: #process has a dependency, push its items dependency into stack 
     for dependency in pro: 
      stack.push(dependency) 
     run(stack.peek) #I need to pass top item of stack as a list 
+3

Не используйте отдельные переменные, используйте словарь, который отображает имена в списки. Затем вы можете искать зависимость в словаре. – Barmar

+1

Будьте осторожны с использованием изменяемых аргументов по умолчанию! http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+0

@Barmar Даже если я беру dict и нажимаю каждый элемент списка для ключа, то также как я могу сказать python взять элемент stack.peek в качестве ключа dict. Не зная о питоне, не могли бы вы рассказать о том, как это будет достигнуто. Спасибо – user1977867

ответ

2

Вот пример рекурсивные, на основе словаря подход:

dependencies = { \ 
    'p1': ['p2', 'p3'], \ 
    'p2': ['p3', 'p4'], \ 
    'p3': ['p4'], \ 
    'p4': [], \ 
    'p5': [] \ 
    } 

def run_order(process, order=None): 

    if order is None: 
     order = [] 

    precursors = dependencies[process] 

    if precursors: 
     for precursor in precursors: 
      run_order(precursor, order) 

     if process not in order: 
      order.append(process) # should really be insert after right-most precursor 

    elif process not in order: 
      order.insert(0, process) # no dependencies, start ASAP 

    return order 

print(run_order('p1')) 

PRINTS

['p4', 'p3', 'p2', 'p1'] 

ли этот порядок процессы правильно для ваших целей? (Вам нужно будет тестировать различные сценарии.) Другой подход, чтобы позволить run_order() взять список процессов:

def run_order(processes, order=None): 

    if order is None: 
     order = [] 

    for process in processes: 
     precursors = dependencies[process] 

     if precursors: 
      run_order(dependencies[process], order) 

      if process not in order: 
       order.append(process) # should really be insert after right-most precursor 

     elif process not in order: 
      order.insert(0, process) # no dependencies, start ASAP 

    return order 

print(run_order(['p1'])) 
print(run_order(list(dependencies.keys()))) 

принтами

['p4', 'p3', 'p2', 'p1'] 
['p5', 'p4', 'p3', 'p2', 'p1'] 

Опять же, проверить различные сценарии, чтобы решить, если он работает для вашей цели.

+0

Спасибо, например, для меня это отлично работает. Я тоже думал о том, как обрабатывать случай перезагрузки. Например, до сих пор мы рассматриваем возможность запуска процессов. Чтобы перезапустить, с помощью 'P5-> P1', тогда после перезапуска P1 нам также нужно запустить P5, потому что он зависит от P1, и поскольку P1 должен быть перезапущен, P5 также должен быть перезапущен. – user1977867