2016-05-15 5 views
0

は、以下のようなリストがあると仮定し、そのリストを示すために、これは任意のリストであることに注意することが重要である文字列/数値と完全にランダムなリストが含まれています。私は、一つ一つのアイテムを取得したいランダムなネストされたリストにリストされていないすべての要素にどのように到達するのですか?

[[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]] 

このリストでは、数字や文字列だけを取得したいが、リストは取得しない。たとえば、文字列、整数、浮動小数点のみを取りますが、リストは使用しない関数を作成しました。私はこの機能を使いたいです。

同じリストを作成したいが、関数の出力に基づいて異なるオブジェクトを作成したい。関数が文字列を数値に変換するとしましょう。私はそのようなリストを作成したいと思う:

[[[1],1],[2,[[123,[[[23]]],23],[12.3,23]]],[[5],1,1]] 

私は考えて答えに来ることができませんでした。どうやってやるの?

+2

[Pythonで浅いリストを平坦化する]の複製があります(http://stackoverflow.com/questions/406121/flattening-a-shallow-list-in-python) – DeepSpace

+0

@DeepSpaceいいえ、その質問のみリストを扱いますリスト内では、任意の深さではありません。 – amiller27

+0

@DeepSpaceそして明示的にそれを平坦化したくない。 – schwobaseggl

答えて

0

おそらく、構造全体を再帰的にトラバースし、その結果を格納するか、関数の結果を関数に呼び出すことができます。ここで

sample = [[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]] 
def traverse(l, f): 
    result = [] 
    for item in l: 
     if isinstance(item, list): 
      result.append(traverse(item)) 
     else: 
      result.append(f(item)) 
    return result 
+0

あなたの返信のために、 しかし、私がこれを使うと、 "float()"という関数を使うと別のリストになります [1.2,1.0,2.0,12.3,23.0,23.0,12.3,23.0,5.0、 1.0、1.0] –

+0

拡張をappendに変更し、ıがelseの中で私の関数を使用する場合:result.append(myfunction(item)),,,この解決策も機能します –

+0

あなたの出力を望んでいませんでした元のものと同じ構造にとどまること。 – amiller27

0

は、ネストされたmapで非常にシンプルな試みに似た機能です::

def map_nested(fnc, l): 
    try: 
     return fnc(l) 
    except: 
     return [map_nested(fnc, sub) for sub in l] 

>>> l = [[["1"],"1"],["2",[["123",[[["23"]]],23],[12.3,"23"]]],[["5"],"1","1"]] 
>>> map_nested(float, l) 
[[[1.0], 1.0], [2.0, [[123.0, [[[23.0]]], 23.0], [12.3, 23.0]]], [[5.0], 1.0, 1.0]] 

それが有効であるlのすべての項目に提供される機能fncを適用するには、このようになりますその関数への引数(またはl自身)を引数にとり、他のものに対して反復しようとします。

関連する問題