Как преобразовать вложенный кортеж кортежей и списков в списки списков в Python?
Вопрос
У меня есть кортеж, содержащий списки и другие кортежи. Мне нужно преобразовать его во вложенные списки с одинаковой структурой. Например, я хочу преобразовать (1,2, [3, (4,5)])
в [1,2, [3, [4,5]]] код>.
Как мне это сделать (в Python)?
Решение
def listit(t):
return list(map(listit, t)) if isinstance(t, (list, tuple)) else t
Самое короткое решение, которое я могу себе представить.
Другие советы
Как новичок в питоне, я бы попробовал это
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]]]
Или, если вам нравится один вкладыш:
def f(t):
return [f(i) for i in t] if isinstance(t, (list, tuple)) else t
Мы можем (ab) использовать тот факт, что json.loads
всегда создает списки Python для списков JSON, а json.dumps
превращает любую коллекцию Python в список JSON: р>
import json
def nested_list(nested_collection):
return json.loads(json.dumps(nested_collection))
Это то, что я придумал, но мне больше нравится другой.
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)
Я вижу, что ответ aztek может быть сокращен до:
def deep_list(x):
return map(deep_list, x) if isinstance(x, (list, tuple)) else x
Обновление . Но теперь из комментария DasIch я вижу, что это не так работать в Python 3.x, так как map () возвращает генератор.