繁体   English   中英

如何使用递归函数操作列表?

[英]How to manipulate a list with recursive function?

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

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

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

原名单:

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

预期输出:

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

在此处输入图片说明

在此处输入图片说明

在您的示例中,发生了三种操作:

  • 列表[2,5]与 2 匹配,因此将[1,2,3]的 2 替换为[2,[2,5]]使列表变为[1,[2,[2,5]],3]
  • 列表[6,3]与 3 匹配,因此将[1,[2[2,5]],3]替换为[3,[6,3]]使列表变为[1,[2,[2,5]],[3,[6,3]]
  • 列表[5,10]与 5 匹配,然后在[2,5]在该 5 旁边添加一个新条目[5,10] ,给出最终结果[[1,[2,[2,5,[10,5]]],[3,[6,3]]]]

对我来说,这里似乎存在不一致的行为,因为第三步遵循与其他两个不同的逻辑。 我会假设这是一个错误,第三步应该是:

  • 列表[5,10]与 5 匹配,因此将[2,5]的 5 替换为[5,[10,5]] ,得到最终结果[[1,[2,[2,[5,[10,5]]]],[3,[6,3]]]]

您可以使用字典来记录每个数字第一次出现的位置,记录在哪个列表中找到它,以及在哪个索引处。 如果然后发现具有已经遇到的值的列表,则可以如上所述改变记录的列表。 如果没有匹配项(第一个列表[1,2,3]就是这种情况),则该列表仅附加到结果中。

这是代码:

def solve(a):
    dct = {}
    result = []
    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:
            target, j = dct[found]
            target[j] = [found, lst]

    return result


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM