Как найти количество вложенных списков в списке?

Функция принимает список и возвращает int в зависимости от того, сколько списков включено в список, не включая сам список. (Для простоты мы можем предположить, что все является либо целым числом, либо списком.)

Например:

x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]

count_list(x) # would return 8

Я думаю, что использование recursion поможет, но я не уверен, как его реализовать, это то, что я до сих пор.

def count_list(a,count=None, i=None):

    if count==None and i==None:
        count=0
        i=0
    if i>len(a)
        return(count)
    if a[i]==list
       i+=1
       count+=1
       return(count_list(a[i][i],count))
    else:
        i+=1
        return(count_list(a[i]))

Ответы

Ответ 1

Это, похоже, выполняет эту работу:

def count_list(l):
    count = 0
    for e in l:
        if isinstance(e, list):
            count = count + 1 + count_list(e)
    return count

Ответ 2

Вы можете сделать это с помощью функции рекурсии:

 
def count(l):
    return sum(1+count(i) for i in l if isinstance(i,list))

Демо:

>>> x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]
>>> count(x)
8

Ответ 3

Вот нерекурсивное решение:

  • Сначала поместите все элементы списка в стек
  • Продолжайте выскакивать предмет со стека, пока он не исчерпан.
  • Если элемент является списком: a) подсчитайте его, b) вставьте все элементы в стек в стек

Код:

def count_list(lst):
    """ Given a master list, count the number of sub-lists """
    stack = lst[:]
    count = 0
    while stack:
        item = stack.pop()
        if isinstance(item, list):
            # If the item is a list, count it, and push back into the
            # stack so we can process it later
            count += 1
            stack.extend(item)
    return count

Ответ 4

Функциональное решение без циклов. Рекурсивно обрабатывает первый элемент списка и хвост списка. Добавьте один для каждого найденного пустого списка (то есть, как только мы закончим обработку некоторого списка, его хвост станет пустым, и мы добавим 1 к результату). И вычтите 1 для самого списка.

def number_of_lists(x):
    f = lambda x: 0 if not isinstance(x,list) else (f(x[0]) + f(x[1:]) if len(x) else 1)
    return f(x) - 1

Результаты:

x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ]
number_of_lists(x)
>> 8

Ответ 5

Мне нравится это хвостовое рекурсивное решение, хотя оно мало используется в Python...

def count_lists(l, counter):
    if (len(l) == 0):
        return counter
    else:
        e = l.pop(0)
        if (isinstance(e, list)):
            l.extend(e)
            return count_lists(l, 1 + counter)
        else:
            return count_lists(l, counter)

x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]]]]
print(count_lists(x, 0))