我正在尝试查找某个号码是否在给定列表中但无法弄明白。
我想出了如何仅使用列表(不是嵌套)来执行此操作:
def find(lst, number):
if len(lst) == 0: #base case
return False
else:
return number in lst
但问题是嵌套列表上面的代码不起作用
到目前为止我所拥有的:
def find(lst, number):
if len(lst) == 0:
return False
else:
for i in lst:
if isinstance(i, list):
for item in i:
if item == number:
return True
elif i == number:
return True
else:
continue
# Nested List (What it should output).
>>> find([1, [3, [4 , [7, 8]], 9]], 8)
True
答案 0 :(得分:1)
使用递归:
def find(lst, number):
for item in lst:
if item == number:
return True
elif isinstance(item, list) and find(item, number):
return True
return False
关键部分在这里:
elif isinstance(item, list) and find(item, number):
如果list元素是另一个列表,则算法会调用自身来确定该数字是否在子列表中。这避免了需要为列表可能具有的无限多个嵌套级别中的每一个编写嵌套的for
循环。
答案 1 :(得分:1)
不是写出一个显式循环,而是可以在生成器表达式上内置any
函数:
def find(lst, num):
return any(x == num or (isinstance(x, list) and find(x, num)) for x in lst)
或者在使用any
递归之前先检查顶级列表的替代版本:
def find2(lst, num):
return num in lst or any(find2(x, num) for x in lst if isinstance(x, list))
any
短路如果找到True
值,那么它应该相对较快,而且它已经具有空列表的正确行为(any([])
返回False
)所以你不需要任何特殊情况。
答案 2 :(得分:0)
def find_recursive(num, lst):
if isinstance(lst, int):
return num == lst
elif not lst:
return False
else:
first = lst[0]
rest = lst[1:]
return find_recursive(num, first) or find_recursive(num, rest)
print(find_recursive(7, [8, [3, [4 , [7, 8]], 9]])) # prints True
print(find_recursive(1, [8, [3, [4 , [7, 8]], 9]])) # prints False
答案 3 :(得分:0)
您可以使用递归,即替换此片段:
if isinstance(i, list):
for item in i:
if item == number:
return True
使用:
if isinstance(i, list):
if find(i, number:
return True