【问题标题】:How merge prev/next lists in python?如何在 python 中合并上一个/下一个列表?
【发布时间】:2013-05-01 05:30:32
【问题描述】:

我有两个 previousnext 项目的列表。

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

对于第一个列表,“Robert”上一个,“Christopher”下一个

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

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

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

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

在 python 中可以轻松实现吗?

【问题讨论】:

  • 您基本上是在寻找通过图的可能路径的起点和终点。
  • 您的数据中是否有循环,例如:[A,B], [B,A], [C,D]?这将导致 (A,A), (C,D)。
  • 不,我不会有循环。 'A' 总是在 'B' 之前,'B' 在 'C' 之前......不过,我可以对这些夫妻有不同的顺序:[B,C], [A,B], [C,D ], [F,G], [E,F]
  • @ChristopheSaugé 然后在我之前发布的链接上查看解决方案。

标签: python list merge


【解决方案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

【讨论】:

  • 它不适用于:items= [['F','G'], ['B','C'], ['A','B'], ['C ','D'], ['E','F']]
  • 项目无法排序。我将编辑我的主题以使其更加清晰。
  • 你能有重复的元素吗?例如:items = [['A', 'B'], ['A', 'C'], ['B', 'D'], ['C', 'D']
  • 我不允许对下面的答案发表评论,但它给出了错误的答案 [['G','D'], ['E','F'], [' F','G']]。它给出 [('A', 'D'), ('E', 'G')] 而不是 [('E', 'D')]。
【解决方案2】:

基于How can I order a list of connections Ashwini Chaudhary 的链接(谢谢 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')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2021-07-17
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多