Come faccio a convertire una tupla nidificata di tuple ed elenchi in elenchi di elenchi in Python?
Domanda
Ho una tupla contenente elenchi e più tuple. Devo convertirlo in elenchi nidificati con la stessa struttura. Ad esempio, voglio convertire (1,2, [3, (4,5)])
in [1,2, [3, [4,5]]]
.
Come posso farlo (in Python)?
Soluzione
def listit(t):
return list(map(listit, t)) if isinstance(t, (list, tuple)) else t
La soluzione più breve che posso immaginare.
Altri suggerimenti
Come novizio di Python proverei questo
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]]]
Oppure, se ti piace una fodera:
def f(t):
return [f(i) for i in t] if isinstance(t, (list, tuple)) else t
Possiamo (ab) utilizzare il fatto che json.loads
produce sempre elenchi Python per elenchi JSON, mentre json.dumps
trasforma qualsiasi raccolta Python in un elenco JSON:
import json
def nested_list(nested_collection):
return json.loads(json.dumps(nested_collection))
Questo è quello che avevo escogitato, ma mi piace che l'altro sia migliore.
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)
Vedo aztek la risposta può essere abbreviata in:
def deep_list(x):
return map(deep_list, x) if isinstance(x, (list, tuple)) else x
Aggiorna : ma ora vedo dal commento di DasIch che questo non sarebbe funziona in Python 3.x poiché map () restituisce un generatore.