给出两个列表,例如
l1 = ["A","D","B","C"]
l2 = ["X","A","Y","B"]
我希望结果保留两个输入列表给定的顺序,即
["X","A","D","Y","B","C"]
结果不是唯一的,因为“ D”和“ Y”也可以切换(但是如果不清楚,字典顺序应该处理冲突) 另外,如果我有。喜欢
l1 = ["B","A"]
l2 = ["X","A","Y","B"]
B或A的位置应互换使用(即不能构造唯一的顺序,B A的顺序应视为A = B),这将导致可接受的结果
["X","A","Y","B"]
(最好按A和B的确定词典顺序)或
["X","B","Y","A"]
以另一种方式我希望列表的组合在唯一和不唯一的地方保留顺序,结果应该是确定性的,例如根据字典顺序。
是否有实现该功能的python库,还是我必须自己实现它? 我查看了OrderedDict和OrderedSet,但它们都无法按我的意愿进行合并。
答案 0 :(得分:0)
您可能想使用topological sorting。如果您不想从头开始实现该算法,则可以使用NetworkX Python程序包:
from itertools import chain
from networkx import DiGraph, topological_sort
l1 = ["A", "D", "B", "C"]
l2 = ["X", "A", "Y", "B"]
# Build the graph
G = DiGraph(chain(zip(l1[:-1], l1[1:]), zip(l2[:-1], l2[1:])))
# Return a list of nodes in topological sort order
result = list(topological_sort(G))
# result: ['X', 'A', 'Y', 'D', 'B', 'C']
基本上,您构建一个图形,其中从点u到点v的每个有向边都暗示着在排序中u排在v之前。在此特定示例中,“ A”位于“ D”之前,“ D”位于“ B”之前,等等:
>>> G.edges
[('A', 'D'), ('A', 'Y'), ('D', 'B'), ('B', 'C'), ('X', 'A'), ('Y', 'B')]