确定数字是否在列表中

时间:2014-02-02 03:47:49

标签: python list

我正在尝试查找某个号码是否在给定列表中但无法弄明白。

我想出了如何仅使用列表(不是嵌套)来执行此操作:

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

4 个答案:

答案 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