У меня есть следующий список объектов, которые я хочу отсортировать по порядку на основе зависимостей.сначала объекты без зависимостей будут сначала добавлены в список, затем пакет, имеющий зависимости от первого добавленного лота, и т. д. и т. д., пока все элементы не будут удалены из списка.
pp = [
{"name": 'pipeline13', "deps": 'pipeline11' },
{"name": 'pipeline1', "deps": 'pipeline4' },
{"name": 'pipeline4'},
{"name": 'pipeline2', "deps": 'pipeline4'},
{"name": 'pipeline3'},
{"name": 'pipeline5'},
{"name": 'pipeline6', "deps": 'pipeline2'},
{"name": 'pipeline7'},
{"name": 'pipeline8', "deps": 'pipeline2'},
{"name": 'pipeline9', "deps": 'pipeline3'},
{"name": 'pipeline10', "deps": 'pipeline1' },
{"name": 'pipeline11', "deps": 'pipeline10' }
]
В настоящее время у меня есть приведенный ниже код, который работает, но он не масштабируемый и не очень питонический.
output = []
output_stage_1 = []
output_stage_2 = []
output_stage_3 = []
output_stage_4 = []
output_stage_5 = []
while pp:
for p in pp:
if not p.get('deps'):
output.append(p)
pp.remove(p)
if p.get('deps') in [i.get('name') for i in output]:
output_stage_1.append(p)
pp.remove(p)
if p.get('deps') in [i.get('name') for i in output_stage_1]:
output_stage_2.append(p)
pp.remove(p)
if p.get('deps') in [i.get('name') for i in output_stage_2]:
output_stage_3.append(p)
pp.remove(p)
if p.get('deps') in [i.get('name') for i in output_stage_3]:
output_stage_4.append(p)
pp.remove(p)
if p.get('deps') in [i.get('name') for i in output_stage_4]:
output_stage_5.append(p)
pp.remove(p)
print(output + output_stage_1 + output_stage_2 + output_stage_3 + output_stage_4 + output_stage_5)