因此,对于深度移除,可以为您提供一个链表和一个值。如果在该列表中找到一个值,则删除并继续,直到删除所有与参数值匹配的值为止。尽管我的程序一旦找到匹配项就停止了。
应该发生什么的示例
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]
遇到嵌套数组时,调用
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]
看看这个分支:
#...
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:])