¿Cómo convierto una tupla anidada de tuplas y listas en listas de listas en Python?
Pregunta
Tengo una tupla que contiene listas y más tuplas. Necesito convertirlo en listas anidadas con la misma estructura. Por ejemplo, quiero convertir (1,2, [3, (4,5)])
a [1,2, [3, [4,5]]] .
¿Cómo hago esto (en Python)?
Solución
def listit(t):
return list(map(listit, t)) if isinstance(t, (list, tuple)) else t
La solución más corta que pueda imaginar.
Otros consejos
Como novato en Python, probaría esto
def f(t):
if type(t) == list or type(t) == tuple:
return [f(i) for i in t]
return t
t = (1,2,[3,(4,5)])
f(t)
>>> [1, 2, [3, [4, 5]]]
O, si te gustan los revestimientos:
def f(t):
return [f(i) for i in t] if isinstance(t, (list, tuple)) else t
Podemos (ab) usar el hecho de que json.loads
siempre produce listas de Python para listas JSON, mientras que json.dumps
convierte cualquier colección de Python en una lista de JSON:
import json
def nested_list(nested_collection):
return json.loads(json.dumps(nested_collection))
Esto es lo que se me ocurrió, pero me gusta más el otro.
def deep_list(x):
"""fully copies trees of tuples or lists to a tree of lists.
deep_list( (1,2,(3,4)) ) returns [1,2,[3,4]]
deep_list( (1,2,[3,(4,5)]) ) returns [1,2,[3,[4,5]]]"""
if not ( type(x) == type( () ) or type(x) == type( [] ) ):
return x
return map(deep_list,x)
Veo que la respuesta de aztek se puede acortar a:
def deep_list(x):
return map(deep_list, x) if isinstance(x, (list, tuple)) else x
Actualización : Pero ahora veo en el comentario de DasIch que esto no funciona en Python 3.x ya que map () devuelve un generador.