¿Cómo encontrar el número de listas anidadas en una lista?

La función toma una lista y devuelve un int dependiendo de cuántas listas hay en la lista sin incluir la lista en sí. (En aras de la simplicidad, podemos asumir que todo es un número entero o una lista).

Por ejemplo:

x=[1,2,[[[]]],[[]],3,4,[1,2,3,4,[[]] ] ] count_list(x) # would return 8 

Creo que usar la recursión ayudaría, pero no estoy seguro de cómo implementarlo, esto es lo que tengo hasta ahora.

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

Esto parece hacer el trabajo:

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

Puedes hacerlo con una función de recursión:

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

Manifestación:

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

Aquí hay una solución no recursiva:

  1. Primero, ponga todos los elementos de la lista en una stack
  2. Sigue sacando un objeto de la stack hasta que se agote.
  3. Si el elemento es una lista: a) cuéntalo, b) inserta todos los elementos en la stack

El código:

 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 

Una solución de estilo funcional sin bucles. Procesa recursivamente el primer elemento de una lista y la cola de una lista. Agregue uno para cada lista vacía encontrada (es decir, una vez que terminamos de procesar alguna lista, su cola se vacía y agregamos 1 al resultado). Y restar 1 para la propia lista.

 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 

Resultados:

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

Me gusta esta solución recursiva de cola, aunque no es muy útil en 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))