Python 如何检查一个列表是否是嵌套列表

37 投票
3 回答
28070 浏览
提问于 2025-04-18 09:32

我有一个列表,有时候它是嵌套的,有时候不是。根据它是否嵌套,后续的处理方式会不同。我该如何检查这个列表是否嵌套呢?应该输出 TrueFalse

举个例子:

[1,2,3] --> False

[[1],[2],[3]] --> True

3 个回答

0
def get_dict_values(data_structure):
    ''' Get a list with the values of a dictionary items '''

    [*values] = data_structure.values()

    return values

def get_list_values(data_structure, temp):
    ''' Transform a nested list into a one depth level list '''

    for item in data_structure:
        if type(item) == list:
            temp = ReturnDataValues.get_list_values(item, temp)

        elif type(item) == dict:
            dict_values = ReturnDataValues.get_dict_values(item)
            temp = ReturnDataValues.get_list_values(dict_values, temp)

        else:
            temp.append(item)

    return temp

def get_object_values(data_structure, result):
    ''' Get all the values of the elements of an object at all its depth levels '''

    data_type = type(data_structure)

    if data_type == dict:
        values = ReturnDataValues.get_dict_values(data_structure)
        ReturnDataValues.get_object_values(values, result)

    if data_type == list:
        ReturnDataValues.get_list_values(data_structure, result)

    return result


**nested_list** = ['a', 'b', ['c', 'd'], 'e', ['g', 'h', ['i', 'j', ['k', 'l']]] ]
print(get_list_values(nested_list))

输出:

 ['a', 'b', 'c', 'd', 'e', 'g', 'h', 'i', 'j', 'k', 'l']
3

我们想检查外层列表中的元素是否是列表类型。就像@Ffisegydd说的,我们可以使用生成器表达式来创建一个生成器,然后用 next() 来遍历它。如果外层循环中的任何一个元素是列表类型,那么调用next()就能正常工作;否则,如果外层循环中的所有元素都不是列表类型,调用next()就会抛出 StopIteration 异常。

最好情况: 如果是嵌套循环(我们可以在看到第一个列表实例时就停止遍历)

最坏情况: 如果不是嵌套循环(我们需要遍历外层列表中的所有元素)

def is_nested_list(l):
    
    try:
          next(x for x in l if isinstance(x,list))
    
    except StopIteration:
        return False
    
    return True

65

你可以使用 isinstance 函数,结合一个 生成器表达式any 函数。这样可以检查你最外层的列表里面是否有任何一个元素是 list 类型的。

In [11]: a = [1, 2, 3]

In [12]: b = [[1], [2], [3]]

In [13]: any(isinstance(i, list) for i in a)
Out[13]: False

In [14]: any(isinstance(i, list) for i in b)
Out[14]: True

需要注意的是,any 函数一旦找到一个符合条件的元素(在这里就是找到一个列表),就会立即返回 True,这样就不用把整个外层列表都遍历一遍,节省了时间。

撰写回答