python - 如何获得在python中复制文件的正确顺序?
问题描述
我正在使用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']
推荐阅读
- javascript - Vue 组件无法读取异步状态更改
- spring-boot - FeignClient 返回 null
- javascript - 从返回未定义的html获取href链接的简单函数,但在被要求时打印链接
- python - 如何在预提交 git hook 上运行 python 包
- xamarin.forms - 为什么当我尝试打开 Xamarin.Mac 项目“MonoDevelop.MonoMac.XamMac2ProjectFlavor”时出现此错误?
- regex - Bash使用正则表达式替换变量中的字符串
- r - R:组合函数并定义生成变量的名称
- rdf - 为什么在 RDF 中为对象使用代码而不是字符串?
- android - “onTextChanged()”返回旧的 EditText 文本值
- java - Java 调查程序结果计算不正确