Ответ 1
Это, похоже, выполняет эту работу:
def count_list(l):
count = 0
for e in l:
if isinstance(e, list):
count = count + 1 + count_list(e)
return count
Функция принимает список и возвращает 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]))
Это, похоже, выполняет эту работу:
def count_list(l):
count = 0
for e in l:
if isinstance(e, list):
count = count + 1 + count_list(e)
return count
Вы можете сделать это с помощью функции рекурсии:
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
Вот нерекурсивное решение:
Код:
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
Функциональное решение без циклов. Рекурсивно обрабатывает первый элемент списка и хвост списка. Добавьте один для каждого найденного пустого списка (то есть, как только мы закончим обработку некоторого списка, его хвост станет пустым, и мы добавим 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
Мне нравится это хвостовое рекурсивное решение, хотя оно мало используется в 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))