您的代码存在三个问题;首先,您对递归调用的结果不做任何事情。其次,您应该使用isinstance()
来检查一个值是否属于某种类型,而不是type(ob) ==
. 第三,不要使用 range() 并检查 i 是否达到最后一个值,如果没有找到,则在循环后返回 False。
总共:
def nestedListContains(NL, target):
for value in NL:
if isinstance(value, int):
test = value == target
else:
# value is not an int, so it's a list
test = nestedListContains(value, target)
if test:
return True # found target
return False # We finished the loop without finding target
如果 NL 根本不是列表,这将引发 TypeError。这可能是一个比 isinstance() 更好的检查——如果它可以被迭代,那么它就是一个列表,如果迭代抛出一个 TypeError 它是我们应该与目标进行比较的东西。我还将使命名更加标准:
def nested_list_contains(nested_list, target):
try:
for value in nested_list:
if nested_list_contains(value, target):
return True
return False
except TypeError:
# It's a single value
return nested_list == target
但还有更好的方法。我们真正想做的是将嵌套列表展平,并检查目标是否在其中。我们可以把上面的代码变成一个生成器,递归地扁平化迭代:
def flatten_nested_list(nested_list):
try:
for v in nested_list:
for flattened in flatten_nested_list(v):
yield flatten
except TypeError:
yield nested_list
def nested_list_contains(nested_list, target):
return target in flatten_nested_list(nested_list)