Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定一个数字是否在列表中_Python_List - Fatal编程技术网

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))