有三個問題與您的代碼;首先,你對遞歸調用的結果不做任何事情。其次,您應該使用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) –