Python: ¿Cómo hacer un bucle en una lista de listas de profundidad variable?

Tengo una estructura de datos como esta (las listas reales de listas son muy largas y de profundidad variable). Sé de antemano su profundidad.

a=( [1,2], [2,3,[4,5]] ) b=( [[1,2],[2,3]] ) 

Un deseo de recorrer cada lista individual. ¿Cómo mejor hacer esto?

No quiero terminar haciendo algo como esto:

 for l in a: if instance(l, list): for ll in l: if instance(ll, list): ... 

Como no definiste el propósito, estoy codificando una función que sum todos los elementos:

 def rec_sum(lst): if not lst: return 0 el = lst.pop() if isinstance(el, list): return rec_sum(el) + rec_sum(lst) else: return el + rec_sum(lst) 

Incluso si conoce la profundidad de antemano, es más fácil de resolver utilizando la recursión.

Recuerda que Python limita 1000 marcos de stack astackdos. Por lo tanto, si su lista tiene más de 1000 artículos, debería obtener una excepción.

Si cree que puede tener más de 1000 elementos, aquí se trata de una solución mixta, que utiliza recursión y para bucles. Se limita a 1000 niveles, en lugar de 1000 elementos:

 def rec_for_sum(lst): if not lst: return 0 count = 0 for el in lst: if not isinstance(el, list): count += el else: count += rec_for_sum(el) return count 

Puedes verificar si un objeto es una lista y solo profundizar:

Consulte también ¿Cómo verificar si un objeto es una lista o una tupla (pero no una cadena)?

 def myprint(list): for i in list: if isinstance(i, list): myprint(i) else: print i 

Puedes usar una combinación de recursión y un generador:

 def flatten_list(list_in): if isinstance(list_in,list): for l in list_in: for y in flatten_list(l): yield y else: yield list_in my_compound_list = [[1,2,3],[4,5,6],[7,8,9,[10,11,12,[13,14,15]]]] print [f for f in flatten_list(my_compound_list)] 

FORMA SIMPLE DE SOLUCIÓN ITERATIVA (BASE NO COMPLETA):

  for item in your_list: if isinstance(item,list): ........... else: ................... 

Esta es una forma de ir Esto debería ser suficiente para empezar.

SOLUCIÓN RECURSIVA:

 def list_flatten(my_list): for item in my_list: if(isinstance(item,list)): list_flatten(item) else: print(item) 

Esta es una solución recursiva para su problema. Pero ten cuidado con el problema de la memoria y la profundidad de la recursión.