Моя программа получила список для сортировки с использованием «прямых зависимостей», переданных как dict
. Один должен появляться после других элементов, от которых он зависит.
Я использую functools.cmp_to_key
, чтобы вернуть 1
или -1
, когда сравниваемые элементы зависят друг от друга, или 0
, если они не:
Вот мой MCVE:
Определение зависимостей:
def dependencies():
return { "B" : ["A"], "C" : ["B","A"], "D" : ["C","B"] }
Функция сравнения:
def dependency_cmp(module_left, module_right):
if module_right in dependencies() and module_left in dependencies()[module_right]:
print( module_right + " needs " + module_left )
return -1
elif module_left in dependencies() and module_right in dependencies()[module_left]:
print( module_left + " needs " + module_right )
return 1
else:
print( module_left + " and " + module_right + " are independent" )
return 0
Функция сортировки:
def doSort( the_list ):
original = the_list[:]
the_list.sort(key=cmp_to_key(lambda left, right: dependency_cmp(left,right)))
print( "Dependencies [" + ",".join(original) + "] sorted to [" + ",".join(the_list) + "]" )
Затем, когда я звоню:
doSort( ["C","D","B","A"] )
doSort( ["B","E","A"] )
Он выводит:
D needs C
D needs B
D needs B
C needs B
C needs A
B needs A
Dependencies [C,D,B,A] sorted to [A,B,C,D]
, что правильно, но:
E and B are independent
A and E are independent
Dependencies [B,E,A] sorted to [B,E,A]
, что не правильно, ябудет ожидать, что на выходе будет [A,B,E]
или [E,A,B]
или [A,E,B]
, поскольку B
нужно A
, а E
не нужно ...
Но как B
, E
и E
, A
порядок правильный, функция сортировки не проверяет B
против A
. Это имеет смысл, но это определенно не то, что я хочу. Вероятно, проблема связана с этим return 0
. Я знаком с C ++, где sort
функции возвращают логическое, а не целое число ...
Какова была бы лучшая стратегия для правильного упорядочивания этих списков?