Я использую python для копирования некоторых файлов. Но я не могу получить правильный порядок копирования.
Предположим, у меня есть класс:
class Info:
def __init__(self, source: str, destination: str):
self.source = source
self.destination = destination
И у меня есть список Info.
Правило порядка копирования:
Если A.destination содержит B.source, поместите B после A.
например
Здесь у нас есть три Info
Id source destination
Info1 Root/A -> Root/B/A
Info2 Root/B -> Root/D/B
Info3 Root/C -> Root/A/C
Info1.destination содержит Info2.source, поэтому поместите Info2 после Info1,
Info3.destination содержит Info1.source, поэтому поместите Info1 после Info3.
Окончательный заказ [Info3, Info1, Info2]
Я думаю, что самая большая трудность в том, что некоторые Info нельзя сравнивать.
Есть ли какой-то эффективный алгоритм для достижения этого? Спасибо!






вы можете сделать это по topological sort, я нашел версию в здесь:
from collections import deque
from collections import defaultdict
GRAY, BLACK = 0, 1
def topological(graph):
order, enter, state = deque(), set(graph), {}
def dfs(node):
state[node] = GRAY
for k in graph.get(node, ()):
sk = state.get(k, None)
if sk == GRAY: raise ValueError("cycle")
if sk == BLACK: continue
enter.discard(k)
dfs(k)
order.appendleft(node)
state[node] = BLACK
while enter: dfs(enter.pop())
return order
тестовый код:
graph = defaultdict(list)
graph['A'].append('B')
graph['B'].append('D')
graph['C'].append('A')
src_info = {'A': 'Info1', 'B': 'Info2', 'C': 'Info3'}
res = [src_info[c] for c in topological(graph) if c in src_info]
print(res)
выход:
['Info3', 'Info1', 'Info2']
Спасибо, расскажите о
topological sort, я использую пакетnetworkxдля решения этой проблемы. Большое спасибо!