3

我有两个前一个下一个项目的列表。

[['Robert','Christopher'],['John','Eric'],['Mark','John'],['Mickael','Robert']]

对于第一个列表, 'Robert' 是previous和 'Christopher' next

我想通过保持最终列表的连续性来合并它们具有最低的前一个和最高的下一个。结果可以是:

[['Mickael','Christopher'],['Mark','Eric']]

或者

[['Mark','Eric'],['Mickael','Christopher']]

结果是两个列表,因为这两个列表之间没有连续性。 上一个下一个无法排序(例如,“Mickael”在“Christopher”之前)。没有循环,也没有重复的元素(即“罗伯特”总是在“克里斯托弗”之前,“约翰”总是在“埃里克”之前......)所以这是一个拓扑图

在python中可以轻松实现吗?

4

2 回答 2

1

我认为这将起作用,并且非常有效:

items = [['A','B'], ['B','C'], ['C','E'], ['E','F'], ['F','G']]
nodes = dict(items)
changed = True
while changed:
    changed = False
    keys = nodes.keys()
    for prevEl in keys:
        if not prevEl in nodes: #may have been deleted
            continue
        nextEl = nodes[prevEl]
        if nextEl in nodes:
            tmp = nodes[nextEl]
            del nodes[nextEl]
            nodes[prevEl] = tmp
            changed = True
于 2013-05-07T10:04:27.380 回答
0

基于如何订购连接列表Ashwini Chaudhary 的链接 (thx Ashwini),我编写了一个适合我需要的解决方案:

items= [['F','G'], ['B','C'], ['A','B'], ['C','D'], ['E','F']]
mydict = dict(items)
for prev,next in items:
    if next in mydict:
        mydict[prev] = mydict[next]
        del mydict[next]
print(list(mydict.items()))

结果是:

[('A', 'D'), ('E', 'G')]
于 2013-05-07T12:56:37.323 回答