Как преобразовать вложенный кортеж кортежей и списков в списки списков в Python? - PullRequest
3 голосов
/ 18 июня 2009

У меня есть кортеж, содержащий списки и другие кортежи. Мне нужно преобразовать его во вложенные списки с одинаковой структурой. Например, я хочу конвертировать (1,2,[3,(4,5)]) в [1,2,[3,[4,5]]].

Как мне это сделать (в Python)?

Ответы [ 4 ]

15 голосов
/ 18 июня 2009
def listit(t):
    return list(map(listit, t)) if isinstance(t, (list, tuple)) else t

Самое короткое решение, которое я могу себе представить.

8 голосов
/ 18 июня 2009

Как новичок в питоне, я бы попробовал это

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
1 голос
/ 30 марта 2016

Мы можем (ab) использовать тот факт, что json.loads всегда создает списки Python для списков JSON, а json.dumps превращает любую коллекцию Python в список JSON:

import json

def nested_list(nested_collection):
    return json.loads(json.dumps(nested_collection))
0 голосов
/ 31 июля 2009

Это то, что я придумал, но мне нравится, что другие лучше.

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 () возвращает генератор.

...