Python 确定一个数字是否在列表中
我试图找出给定的列表中是否有一个数字,但无法找出它 我只知道如何使用一个列表(不是嵌套的)来实现这一点: 但问题是嵌套列表上面的代码无法工作 到目前为止,我所拥有的:Python 确定一个数字是否在列表中,python,list,Python,List,我试图找出给定的列表中是否有一个数字,但无法找出它 我只知道如何使用一个列表(不是嵌套的)来实现这一点: 但问题是嵌套列表上面的代码无法工作 到目前为止,我所拥有的: def find(lst, number): if len(lst) == 0: return False else: for i in lst: if isinstance(i, list): for item in i:
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
您可以使用递归,即替换这一部分:
if isinstance(i, list):
for item in i:
if item == number:
return True
与:
使用递归:
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):
如果列表元素是另一个列表,则算法会调用自身来确定该数字是否在子列表中。这避免了为列表可能具有的无限多个嵌套级别中的每一个编写嵌套的
循环。您可以在生成器表达式上使用内置的函数,而不是编写显式循环:
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
),因此不需要任何特殊情况。为什么在非递归算法中有基本情况
注释?此外,你为什么要说这句话<代码>lst中的返回编号
适用于空列表;参见Dub.懒惰(和错误)方式:将列表转换为字符串,删除所有<代码> [< /代码>和<代码> > />代码>代码> EVA<代码>它并检查<列表> <代码> >代码> >数字,而这可以通过扁平化来完成,我不认为这是关于扁平化的问题的一个复制。@ USER535112,不管你怎么尝试,您需要将列表展平,或者至少像展平一样遍历它。您应该在非lst
之前检查isinstance
,否则您可能永远找不到编号0
@JBernardo好的捕获!修正,谢谢:)
elif isinstance(item, list) and find(item, number):
def find(lst, num):
return any(x == num or (isinstance(x, list) and find(x, num)) for x in lst)
def find2(lst, num):
return num in lst or any(find2(x, num) for x in lst if isinstance(x, list))