我有一个奇怪的数据导入任务,我需要根据它的部分列表重建一些数据的原始顺序(从古代列表中生成的文件生成,无法访问内部数据存储区),其中所有数据都是在列中:
这表示必须联系每个人的顺序。
COLUMN1
MARTHA LOPES PEREZ
LEIMAR CONEO BELTRAN
ADALGISA CONEO BELTRAN
YESMIS LUZ DEDOLLA
ELIJIO ARROYO DIAZ
COLUMN2
ROBERTO MANUEL VILLEGAS
MARTHA LOPES PEREZ
LUDIS GUERRA CORONADO
PATRICIA FABRA MEDINA
LEIMAR CONEO BELTRAN
ADALGISA CONEO BELTRAN
YESMIS LUZ DEDOLLA
ELIJIO ARROYO DIAZ
TEOBALDO MONTIEL SALGADO
COLUMN3
LUDIS GUERRA CORONADO
ANDRES ORTEGA DIAZ
PATRICIA FABRA MEDINA
LEIMAR CONEO BELTRAN
ELIJIO ARROYO DIAZ
TEOBALDO MONTIEL SALGADO
YENIS MONTES ROMEROS
SANTA PEREZ GAVIRIA
有了这个,我需要重新生成它的顺序。这是所需的输出:
ROBERTO MANUEL VILLEGAS (Because is before MARTHA)
MARTHA LOPES PEREZ (Because nobody is behind him)
LUDIS GUERRA CORONADO (Because is after MARTHA)
ANDRES ORTEGA DIAZ
PATRICIA FABRA MEDINA
LEIMAR CONEO BELTRAN
ADALGISA CONEO BELTRAN
YESMIS LUZ DEDOLLA
ELIJIO ARROYO DIAZ
....
....
因此将该值与所有列进行比较。
我认为这是排序合并连接,如下所示:
http://sqlity.net/en/1480/a-join-a-day-the-sort-merge-join/
我不需要高效的版本,这只是一次性的任务。
答案 0 :(得分:1)
您正在寻找的算法是topological sorting。每个列都定义了名称之间的依赖关系,您可以将所有这些依赖关系放入一个图形中:每个名称都是一个节点,对于列表中的每对连续项目,都有一个从第一个名称到第二个名称(反之亦然,具体取决于您使用的实现)。只需遍历每个列表并随时创建这些节点和边缘,然后在完成后,在结果图上运行拓扑排序算法。
toposort package包括拓扑排序实现,它与Python 3(和2)兼容。它期望给出关系的集合字典,你可以构造这样的东西:
graph = collections.defaultdict(set)
for column in columns:
for first, second in pairwise(column)
graph[second].add(first)
pairwise
是itertools
个收件人之一,您可以从包的文档中复制到您的代码中,也可以使用more-itertools
package中的实现。构建完图表后,使用toposort.toposort_flatten(graph)
按顺序获取名称。
请注意,输出可能不完全是确定性的,因为可能有一些名称没有指定依赖关系 - 换句话说,没有什么可以告诉哪一个应该首先。