¿Cómo convierto una tupla anidada de tuplas y listas en listas de listas en Python?

StackOverflow https://stackoverflow.com/questions/1014352

  •  06-07-2019
  •  | 
  •  

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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top