deep remove的递归不会移过匹配项

2024-09-30 10:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

所以对于deepremove,可以给你一个链表和一个值。如果在该列表中找到一个值,则删除并继续,直到删除与参数值匹配的所有值。虽然我的程序一找到匹配就停止了

应该发生什么的例子

removedeep(3, [1, 2, 3, 4])   --> [1, 2, 4]
         removedeep(3, [1, [2, 3], 4]) --> [1, [2], 4]
         removedeep(3, [1, 2, 4]) --> [1, 2, 4]
         removedeep(3,  --> [1, [2], 4]


def removedeep(x, L):
    '''test if x occurs within the nested list L.

       E.g., removedeep(3, [1, 2, 3, 4])   --> [1, 2, 4]
             removedeep(3, [1, [2, 3], 4]) --> [1, [2], 4]
             removedeep(3, [1, 2, 4]) --> [1, 2, 4]
             removedeep(3,  --> [1, [2], 4]'''

    if not L:
        return []
    elif type(L[0]) == type(x):
        if(L[0] == x):
            return removedeep(x, L[1:])
        else:
            return [L[0]] + removedeep(x, L[1:])
    else:
        return removedeep(x, L[0])

    print(removedeep(4,[1,2,[4],3,5,6]))

虽然我的输出是[1,2]而不是[1,2,3,5,6]


Tags: test程序列表returnifdeftypeelse
2条回答

看看这个分支:

#...
else:
    return removedeep(x, L[0])

怎么样L[1:]
考虑您的示例,当您进入这个分支时,您的L现在是[[4],3,5,6],但是您只返回removedeep(4,[4])

**编辑版本:

    else:
        # if you always remove a single element from a list 
        return [removedeep(x, L[0])] + removedeep(x, L[1:])

遇到调用的嵌套数组时:

else:
    return removedeep(x, L[0])

这会忽略它之后的任何值,因此给定输入,例如4,[1,2,[4],3,5,6]),您可以点击[4]并调用removedeep(x, [4]),但是您无法到达数组的3, 5, 6部分。不知怎么的,你需要包括这些。快速的方法是添加:

else:
    return removedeep(x, L[0]) + removedeep(x, L[1:])

由此得出:

> print(removedeep(4,[1,2,[4, [90, 4],9],3,[4,5,6]]))
[1, 2, 90, 9, 3, 5, 6]

相关问题 更多 >

    热门问题