2009-06-18 18 views
2

私はリストとより多くのタプルを含むタプルを持っています。同じ構造の入れ子リストに変換する必要があります。たとえば、(1,2,[3,(4,5)])[1,2,[3,[4,5]]]に変換したいとします。タプルとリストのネストされたタプルをPythonのリストのリストに変換するにはどうすればよいですか?

どうすればいいですか(Pythonで)?

def f(t): 
    return [f(i) for i in t] if isinstance(t, (list, tuple)) else t 
+7

私は答えを知っているが、私はあなたにあげます最初にソリューションを投稿するチャンス – SilentGhost

+0

そしてスタンドオフは続きます..... – Randolpho

+0

私は質問がありますが、それを後方に - ()tsilと綴る必要があります。 – gimel

答えて

12
def listit(t): 
    return list(map(listit, t)) if isinstance(t, (list, tuple)) else t 

私は想像することができ、最短ソリューション:あなたは1つのライナーを好きなら

+0

map()は常にリストを返します。リスト(map(...))はmap(...)でなければなりません。 – NicDumZ

+1

NicDumZはPython 2.xでも、3.x map()ではジェネレータを返します。 – DasIch

+0

と、クリスチャンの答えとの違いは何ですか? – SilentGhost

6

Pythonの初心者として、私は、この

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]]] 

を試すかでしょう。

+4

オブジェクトのタイプをチェックする必要があるときは、isinst ance()関数。 isinstance(t、(list、tuple)) – efotinis

+0

hasattr(t、 '__ iter__')おそらく – Jimmy

+0

@Jimmy 'hasattr(t、 'iter')'のような複数の型を一度にチェックすることもできます。多くの場合、strはiterableであるため(通常は文字のリストに変換する必要はありません) –

0

これは私が思いついたものですが、私は他の方が良いと思います。これは以降のPython 3.xでは動作しないだろうとのコメント私はaztek「:

def deep_list(x): 
    return map(deep_list, x) if isinstance(x, (list, tuple)) else x 

更新しかし、今、私はDasIchから見るの答えはに短縮することができます」を参照

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) 

map()はジェネレータを返します。

2

我々は(AB)はjson.dumpsはJSONリストに任意のPythonのコレクションを回しながらjson.loadsは常に、JSONリストのPythonのリストを生成しているという事実を使用することができます。

import json 

def nested_list(nested_collection): 
    return json.loads(json.dumps(nested_collection)) 
関連する問題