合并两个排序列表并保留顺序

时间:2020-05-29 09:08:45

标签: python algorithm

给出两个列表,例如

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,但它们都无法按我的意愿进行合并。

1 个答案:

答案 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')]