2017-02-20 37 views
3

我在列表清單中有一個樹狀結構。我想把它弄平。平展可重複樹

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

下面是規則中,在最低水平兩個二項列表被合併在這樣一種方式,即在兩個 列表之間共享的中間數壓扁/接合是這樣的:

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

這將導致四到三個元素列表。在這第二個操作中,兩個列表之間的中間2個數字被壓扁。

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

在接下來的步驟中,中間的3個數字被壓扁/連接...等等以相同的方式。

順便說一句,你不需要做任何檢查,它是保證中號總是重複即匹配。

每個較高級別都會在整個序列中增加一個新數字。 也可以使用任何數字,這裏我們只使用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

爲什麼你更喜歡isiter()而不是isinstance()?速度更快嗎? – user1019129

+0

'isiter()'是我傾向於使用的toolz庫的一部分。你也可以提供元組或迭代器來壓扁而不僅僅是列表。 – Ohjeah