2014-12-23 3 views
1

문제점 :Unflattening 파이썬리스트

인수 으로 목록을 취하여 중첩리스트를 작성 "패턴 화 해제"라는 함수를 작성한다.

다음과 같이 인수리스트의 형식은 다음

정수 항목 인스턴스에 대한 중첩 된리스트의 콘텐츠 것이다 중첩리스트 정수가 아닌 항목 의 시작을 나타내고,

[2- , 'a', 3, 'b', 'c', 'd']는 [ 'a', [ 'b', c ','d ']]로 변환됩니다. 첫 번째 숫자 2는 상위 목록에는 2 개의 항목이 포함됩니다. 'a'는이 상위 목록의 첫 번째 항목입니다. 숫자 3은 3 개의 항목을 포함하는 새로운 하위 목록의 시작을 나타냅니다.

샘플 실행 : 나는 간단한 재귀를 수행 한

>>> unflatten([2, 'x', 'y']) 
['x', 'y'] 
>>> unflatten([ 3, "a", "b", 3, "t", "y", "u" ]) 
['a', 'b', ['t', 'y', 'u']] 
>>> unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ]) 
['a', 'b', ['c', 'd', ['x', 'y']], ['w', ['t', 'y', 'u']]] 

. 이제

def unflatten(LIST): 
    if not len(LIST): 
     return [] 
    elif isinstance(LIST[0], int): 
     return [unflatten(LIST[1:])] 
    else: 
     return [LIST[0]] + unflatten(LIST[1:]) 


>>> unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ]) 
[['a', 'b', ['c', 'd', ['x', 'y', ['w', ['t', 'y', 'u']]]]]] 

당신이 볼 수 있듯이,리스트의 길이가 내 기본 재귀 제어되지 않으므로 단순히 말에 모든 목록을 종료 : 여기 내 코드입니다.

길이를 반복적으로 추적하거나 반복적으로 추적 할 수있는 방법을 모르겠습니다. 모듈을 가져 오지 않고이 작업을 수행하는 방법을 제안하면 기쁠 것입니다.

+1

'isinstance (LIST [0], int)'이면 다음에'LIST [0]'요소가 있음을 고려해야합니다. 'unflatten (l)'은'unflatten_bis (l [1 :], l [0])'을 호출 할 수 있고'unflatten_bis'는 모든 작업을 수행 할 수있는 도우미 함수를 사용할 수 있습니다. (단지 제안) – fredtantini

답변

3

위치를 추적하는 한 가지 방법은 돌아 오는 것입니다. 아래 코드에서 부분적으로 작성된 unflattened 목록과 병합 된 목록의 현재 인덱스를 반환하는 도우미 함수를 사용합니다.

def unflatten(l): 
    def helper(l, start): 
    if isinstance(l[start], int): 
     ret = [] 
     start += 1 
     for _ in range(l[start - 1]): 
     sub, start = helper(l, start) 
     ret.append(sub) 
     return ret, start 
    else: 
     return l[start], start + 1 
    return helper(l, 0)[0] 

print unflatten([2, 'x', 'y']) 
print unflatten([ 3, "a", "b", 3, "t", "y", "u" ]) 
print unflatten([ 4, "a", "b", 3, "c", "d", 2, "x", "y", 2, "w" , 3, "t", "y", "u" ])