【问题标题】:join lists based on common head or tail基于共同头部或尾部的加入列表
【发布时间】:2010-02-19 13:02:30
【问题描述】:

解决以下问题的最快方法是什么 我将根据共同的头部或尾部加入几个列表

input = ([5,6,7], [1,2,3], [3,4,5], [8, 9])
output = [1, 2, 3, 4, 5, 6, 7]

【问题讨论】:

  • 你所说的共同头或尾是什么意思。 ?您应该详细说明如何获得输出
  • 我想要一个可以在5上加入[5,6,7]和[3,4,5]组成[3,4,5,6,7]和[1, 2,3] 到 3 上的这个输出形成 [1, 2, 3 4, 5, 6, 7]
  • ([1, 2, 3], [3, 4], [3, 4, 5, 6]) 的情况如何?
  • 加入哪些列表可能不明确。
  • 那么 ([1,2,3], [3,4,1]) 或任何其他可以形成循环的组合呢?

标签: python list join tail head


【解决方案1】:
>>> def chain(inp):
    d = {}
    for i in inp:
        d[i[0]] = i[:], i[-1]
    l, n = d.pop(min(d))
    while True:
        lt, n = d.pop(n, [None, None])
        if n is None:
            if len(d) == len(inp) - 1:
                l, n = d.pop(min(d))
                continue
            break
        l += lt[1:]
    return l

>>> chain(input)
[1, 2, 3, 4, 5, 6, 7]
>>> chain(([5,6,7], [1,2,10], [3,4,5], [8, 9]))
[3, 4, 5, 6, 7]

【讨论】:

  • 感谢 SilentGhost。它足够通用(str 和 int)并且可以完美运行。这种方法有没有通用名称。我称之为“平铺列表”
  • 输入 = ([5,6,7], [1,2,3], [3,4,5], [8, 9], [9, 10, 11], [ 12]) output = ([1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11]) 在这种情况下递归是个好主意吗?
  • 输入 = ([5,6,7], [1,2,10], [3,4,5], [8, 9]) 输出 = [3, 4, 5, 6, 7] 哎呀!如果给出上述输入,前一个将不起作用
  • 鉴于上述输入,您只需检查d并再次运行我的代码,从而获得[8,9,10,11]列表。在您的第二个示例中,您可以执行相同的操作,但不清楚您将排除 [1, 2, 10][8,9] 列表的依据是什么。
  • [3,4,5] 和 [5,6,7] 正在连接,因为 [3,4,5] 有一个尾部 5,而 [5,6,7] 有一个头部 5。
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2017-08-05
相关资源
最近更新 更多