【问题标题】:How to manipulate a list with recursive function?如何使用递归函数操作列表?
【发布时间】:2021-12-11 07:50:57
【问题描述】:

我正试图以一种不寻常的方式(至少对我而言)操纵给定的列表。

基本上,我有列表a(也是图1),它有第一个索引作为主体。现在,我想遍历其他索引,如果某个值与第一个索引中的一个匹配,我想将该索引的子列表插入到第一个索引中。

我不知道我是否足够清楚,但目标应该是列表b(也是图2)。我认为这里应该使用递归函数,但我不知道如何。大家觉得有可能吗?

原名单:

a = [[1,2,3],[2,5],[6,3],[10,5]]

预期输出:

b = [[1,2,[2,5,[10,5]],3,[6,3]]]

【问题讨论】:

  • @9769953 感谢您的建议! ;)
  • 如果输入有多个匹配相同值的子列表会有什么影响?什么是与多个值匹配的子列表?例如,[[1,2],[1,2],[1,2],[2,1]] 会产生什么结果?
  • @trincot 这种情况不会发生。在列表“a”中,某个值将仅显示 2x。例如,值 3 出现在索引 0 处,然后出现在 3 处。因此,一次只匹配一个。

标签: python list python-2.7 recursion


【解决方案1】:

您可以使用字典来记录每个数字在哪里第一次出现,记录在哪个列表中找到它,以及在哪个索引处。如果然后找到具有已经遇到的值的列表,则可以在插入匹配列表的情况下对记录的列表进行变异。如果没有匹配项(第一个列表 [1,2,3] 就是这种情况),那么这个列表只是附加到结果中。

因为插入到列表中会影响其他插入点,建议先收集插入动作,然后倒序应用:

下面是代码:

def solve(a):
    dct = {}
    result = []
    insertions = []
    for lst in a:
        found = None
        for i, val in enumerate(lst):
            if val in dct:
                found = val
            else:
                dct[val] = [lst, i]
        if found is None:
            result.append(lst)
        else:
            insertions.append((*dct[found], lst))

    for target, i, lst in reversed(insertions):
        target.insert(i + 1, lst)
        
    return result


# Example run:
a = [[1,2,3],[2,5],[6,3],[10,5]]
print(solve(a))

输出:

[[1, 2, [2, 5, [10, 5]], 3, [6, 3]]]

【讨论】:

  • 嗨@trincot,感谢您的努力!你是如此封闭,我很确定这是因为你很困惑,你在最后的评论中是对的,当你说你会期待像 [[1,[2,[2,[5,[10,5]]]],[3,[6,3]]]] 这样的东西时。第一个值 2 不需要像我原来的帖子那样缩进,因为你的方式更具可读性。我将在列表目标和代码结果中附加 2 张图像。我将尝试处理您的代码和想法。 drive.google.com/drive/folders/…
  • 很抱歉造成混乱,即使是我,我也对这么多大括号感到困惑。但我现在更新了它,正确的输出是[[1,2,[2,5,[10,5]],3,[6,3]]]。你已经做了这么多,我会继续你的剧本,我想我可以做到。可惜我没有足够的声望给你点个赞,所以我会考虑由你解决!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 2013-11-01
  • 2022-11-26
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多