2017-02-20 14 views
3

私はリストのリストに木のような構造を持っています。私はそれを平らにしたい。ここ 反復可能なツリーを平滑化

[[[[2, 1], [1, 2]], [[1, 2], [2, 1]]], [[[1, 2], [2, 1]], [[2, 1], [1, 2]]]] 

は、ルールである2つの2項目リストは、2つの リスト間で共有される中央の数字は押し潰されるように結合される最低レベルの/次のように接合された:

[2, 1], [1, 2] => 212 
[1, 2], [2, 1] => 121 

これにより、4つの要素リストが生成されます。この第2の操作では、2つのリストの中間の2つの数字が押しつぶされます。

212 121 , 121 212 => 2121 , 1212 => 21212 

次の手順では、中間の3つの数字が同じ方法で押し縮められます。

Btwあなたはミドルナンバーが常に繰り返されること、すなわち一致することが保証されていることを確認する必要はありません。

すべての上位レベルでは、シーケンス全体に1つ以上の新しい番号が追加されます。 また、任意の数値を使用することができます。ここでは簡単のため1と2のみを使用しています。

任意のアイデア。

解決策がPythonであれば、他の言語も歓迎します。 しかし、一般的に私はそのアイデアを探しています。まだそれをテストするが、これは作業を行うように見えるん:

def squash(self, lst1, lst2): 
    return lst1 + [lst2[-1]] 

def unroll(self, lol): 
    print lol 
    if isinstance(lol[0], int) : return lol 
    if isinstance(lol[0][0], int) : return self.squash(lol[0], lol[1]) 
    rv = [ self.unroll(lol[0]) , self.unroll(lol[1]) ] 
    return self.unroll(rv) 

任意の簡素化の歓迎...

+0

LoL?リストのリスト?あなた自身の略語を使用しないでください。これはツイッターではない、言葉の制限はありません。また、深さは常に同じですか?あなたが再帰を必要としているようには思われません。 –

+0

の深さが異なる可能性があります。 – user1019129

答えて

1

これはスカッシュの入力は常に2つの要素を持つリストであると想定。

def isiter(x): 
    try: 
     iter(x) 
     return True 
    except TypeError: 
     return False 

def squash(x): 
    if isiter(x[0][0]): 
     return squash([squash(y) for y in x]) 
    else: 
     return x[0] + x[1][-1:] 
+0

isinstance()よりもisiter()を好む理由は何ですか?それは速いですか? – user1019129

+0

'isiter()'は、私が使う傾向があるtoolzライブラリの一部です。リストだけでなく、タプルやイテレータをスカッシュすることもできます。 – Ohjeah

関連する問題