'Finding all the elements of the deepest list within a list in python without NUMPY

I am trying to code to retrieve all the list which is the "deepest" within a list. I managed to retrieve only one of the list which is the deepest and I am unable to print out all if they have the same "depth". I tried hardcoding it by it will not work if there is 2 or more values of the same depth. Can anyone share how can I modify my code to make it work?

Input: [1,2,[[3]],[[4]],[[5]], [6]]

Output: [3],[4],[5]

def get_deepest(L):
    def get_dpst(L, maxdepth):
        deepest_list = [L, maxdepth]
        for e in L:
            is_list = isinstance(e,list)
            if is_list:
                rList = get_dpst(e, maxdepth+1)
                if rList[1] > deepest_list[1]:
                    deepest_list = rList
                elif rList [1] == deepest_list[1]:
                    deepest_list[1] = rList[0]
        return deepest_list
    rList = get_dpst(L, 0)
    return rList[0]

print (get_deepest(my_list))


Solution 1:[1]

How about a pair of functions like this?

  • unnest is a recursive function that walks a tree of lists, yielding tuples of any non-list value and its depth
  • get_deepest_values uses unnest and keeps track of the deepest depth it has returned, gathering only those values.
def unnest(lst, depth=0):
    for atom in lst:
        if isinstance(atom, list):
            yield from unnest(atom, depth + 1)
        else:
            yield (atom, depth)


def get_deepest_values(inp):
    deepest_depth = 0
    deepest_depth_values = []
    for value, depth in unnest(inp):
        if depth > deepest_depth:
            deepest_depth = depth
            deepest_depth_values.clear()
        if depth == deepest_depth:
            deepest_depth_values.append(value)
    return (deepest_depth, deepest_depth_values)


inp = [1, 2, [[3]], [[4]], [[5, "foo"]], [6]]
deepest_depth, deepest_values = get_deepest_values(inp)
print(f"{deepest_depth=} {deepest_values=}")

The output is

deepest_depth=2 deepest_values=[3, 4, 5, 'foo']

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 AKX