NetworkX类Git图的时间拓扑排序:字典序拓扑排序使用咨询
关于NetworkX拓扑排序结合日期排序的问题解答
1. 是否可以用lexicographical_topological_sort实现拓扑顺序+日期排序?
完全可以。lexicographical_topological_sort的核心作用就是在满足拓扑排序的依赖关系前提下,通过自定义的key函数对无依赖的节点(即拓扑排序中可并列选择的节点)进行排序,以此打破平局。用提交日期(timestamp)作为键,正好符合需求——既保证提交的依赖顺序(拓扑顺序),又让同层级的提交按时间先后排列。
2. 正确调用方式与节点属性访问问题
调用方式的关键在于节点的存储形式:
- 如果你的节点是自定义类的实例(比如每个节点对应一个提交对象,自带
timestamp属性):
你最初的写法是可行的,lambda n: n.timestamp可以直接访问节点对象的属性,因为n就是传入的节点实例,不会被自动转成字符串或哈希值。示例代码:import networkx as nx # 自定义提交类,包含timestamp属性 class Commit: def __init__(self, sha, timestamp): self.sha = sha self.timestamp = timestamp # 构建有向图 G = nx.DiGraph() commit1 = Commit("abc123", 1620000000) commit2 = Commit("def456", 1620001000) G.add_edge(commit1, commit2) # 执行排序 sorted_commits = list(nx.lexicographical_topological_sort(G, key=lambda n: n.timestamp)) - 如果你的节点是字符串/哈希值(比如用提交SHA作为节点ID,timestamp存在节点的属性字典中):
此时需要通过图的nodes属性获取节点的timestamp,写法改为lambda n: G.nodes[n]['timestamp']。示例代码:import networkx as nx G = nx.DiGraph() # 添加节点时附带timestamp属性 G.add_node("abc123", timestamp=1620000000) G.add_node("def456", timestamp=1620001000) G.add_edge("abc123", "def456") # 执行排序 sorted_commits = list(nx.lexicographical_topological_sort(G, key=lambda n: G.nodes[n]['timestamp']))
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

