有三个问题与您的代码;首先,你对递归调用的结果不做任何事情。其次,您应该使用isinstance()
来检查某个值是否属于某种类型,而不是type(ob) ==
。第三,不是使用range()并检查我是否到达最后一个值,只要在循环后返回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
这将抛出一个TypeError如果NL不是列表中的所有。这可能比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
但还有一种更好的方法。我们真正想要做的就是拼合嵌套列表,并检查目标是否在其中。我们可以把上面的成平展iterables递归发电机:
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)
在你需要有底部elif的情况下,“回归nestedListContains ......”这样的递归调用知道返回的功能底部的返回值。 –
[Weird函数返回值?]可能的重复(http://stackoverflow.com/questions/11097822/weird-function-return-value) –