Python检查一个列表是否嵌套

37

我有一个列表,有时它是嵌套的,有时不是。基于是否嵌套,其继续过程不同。如何检查此列表是否嵌套?应输出TrueFalse

示例:

[1,2,3] --> False

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


1
“the continuation is different” - 怎么不同?也许你只是想将其“展平”? - georg
1
我正在将它放入一个“数据框”中。如果它是平面的或嵌套的,执行此操作的代码是不同的。展开嵌套列表会给我一个不同的数据结构。我需要保持原有的结构。 - jason
3个回答

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,因此您不必不必无谓地遍历整个外部列表。


如果我的列表中有浮点数元素,我会得到TypeError:'numpy.float32'对象不可迭代 - Khaned

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


你能否在你的答案后面附上一些评论,以便我们更好地理解你的代码? - Simas Joneliunas
@SimasJoneliunas 我已经添加了评论,请告诉我是否有帮助。 - Anandhu Gopi

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']

这是一个很好的例子,说明为什么你永远不应该使用可变类型作为默认值。你试过运行两次吗?例如,请参见 https://florimond.dev/en/posts/2018/08/python-mutable-defaults-are-the-source-of-all-evil/。 - Vincenzooo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接