2017-02-20 1 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 

이렇게하면 4-3 개의 요소 목록이 생성됩니다. 이 두 번째 작업에서는 두 목록 사이의 가운데 두 숫자가 부숴집니다.

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

다음 단계에서 중간 3 숫자는 동일한 방식으로 스쿼시/합쳐집니다.

Btw 수표를 확인하지 않아도 중간 번호가 항상 반복적으로 반복되는 것이 보장됩니다.

모든 상위 레벨은 전체 시퀀스에 하나 이상의 새 번호를 추가합니다. 또한 모든 숫자를 사용할 수 있습니다. 여기서는 단순화를 위해 1과 2 만 사용했습니다.

아이디어가 없습니다.

해결책이 있다면 파이썬으로, 다른 언어도 환영합니다. 하지만 일반적으로 나는 그 아이디어를 찾고 있습니다. 그럼에도 불구하고 그것을 테스트,하지만이 일을 할 것 같다 않습니다

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

이 스쿼시의 입력은 항상 두 요소 목록입니다 가정합니다.

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()'는 필자가 사용하는 툴바 라이브러리의 일부이다. 또한 목록 대신 스쿼시에 튜플 또는 반복기를 제공 할 수 있습니다. – Ohjeah