2013-04-24 5 views
0

방금 ​​학습을 시작했고리스트의 중첩 깊이를 알려주는 프로그램을 작성했습니다. 글쎄, 내가 주위를 탐색하고 이것을 수행하는 작업 코드를 발견했지만, 나는 아직도 어떻게 작동하는지 이해하는 데 어려움을 겪고있다. 코드는 다음과 같습니다.이 코드를 이해하는 데 어려움이 있습니다

def depth(L) : 
    nesting = [] 
    for c in L: 
     if type(c) == type(nesting) : 
      nesting.append(depth(c)) 
    if len(nesting) > 0: 
     return 1 + max(nesting) 
    return 1 

당연히 필자는 재귀를 호출하는 append와 함께 혼란에 빠지기 시작합니다. 누구가 여기에서 무슨 일이 일어나고 있는지 설명하는 간단한 방법이 있습니까? 실제로 추가되는 것이 무엇인지 확신 할 수 없으며, 내 머리 속의 테스트 케이스를 통해이를 통과하는 것이 도움이되지 않습니다. 감사!

편집 : 형식이 좋지 미안 경우, 나는 그래서이 될 것으로 보인다 것은 당신이 그것을 넣어, 목록 및 계산을 취하는 함수, 그것의 중첩 깊이가 내 전화

+0

'type (nesting)'대신'type (L)'을 사용하는 것이 더 낫습니다. 그런 다음이 함수는 중첩 된 튜플을 처리 할 수도 있습니다. –

답변

2

과 같이 코드를 변경, 내가 당신에게 쉬운 방법을 보여 보자 (### 당신이 거기에 무슨 일이 일어나고 있는지 볼 수 있도록 내가 코드에 추가 된 새로운 라인입니다)

def depth(L) : 
    nesting = [] 
    for c in L: 
     if type(c) == type(nesting) : 
      print 'nesting before append', nesting ###  
      nesting.append(depth(c)) 
      print 'nesting after append', nesting ### 
    if len(nesting) > 0: 
     return 1 + max(nesting) 
    return 1 

이제 깊이의 목록을 만들 수 있습니다 :

l=[[1,2,3],[1,2,[4]],'asdfg'] 

우리의 목록은 3 요소를 볼 수 있습니다. 그 중 하나는 목록이고, 다른 하나는 자체 목록에 다른 목록이 있고 마지막 하나는 문자열입니다. 당신은 분명이 목록의 깊이가 3 볼 수 있습니다 (즉 메인리스트의 두 번째 요소에서 함께 중첩이 개 목록이 있습니다)

이 코드를 실행할 수 있습니다이 : 케이크의

>>> depth(l) 
nesting before append [] 
nesting after append [1] 
nesting before append [1] 
nesting before append [] 
nesting after append [1] 
nesting after append [1, 2] 
3 

원피스! 이 함수는 1을 중첩에 추가합니다. 요소가 또 다른 목록을 가지고 있으면 함수 자체가 호출 된 시간의 수인 중첩에 1 + 최대 수를 추가합니다. 요소가 문자열이면 건너 뜁니다.

마지막으로 재귀가 발생한 최대 횟수 인 중첩의 최대 수를 반환합니다.이 횟수는 기본 목록의 목록 안의 목록 인 깊이 (일명 깊이)입니다. 우리의 경우 재귀는 두 번째 요소에 대해 두 번 + 1 = 3으로 예상됩니다.

그래도 문제가 발생하면 print 문이나 다른 변수를 함수에 추가하여주의 깊게 살펴보고 결국 얻을 수 있습니다.

+0

감사합니다, 인쇄 진술을 좀 더 잘 이해하는 데 도움이 됐어. – Austin

1

에서이를 입력했습니다. 중첩이 목록이므로 어떤 if type(c) == type(nesting)이 말하는 것입니다 : 목록 L의 항목이 목록 인 경우 함수를 다시 실행하고 추가하고 함수를 다시 실행하면 중첩 목록이 없어 질 때까지 동일한 테스트가 수행됩니다 모든 목록 1.

의 깊이를 가지고 있기 때문에 목록에 L 한 다음 + 중첩 된 목록의 최대 양을 1을 반환이 중

+0

파이썬에서는 배열이 아닌리스트라고합니다. –

+0

죄송합니다. 배열을 호출하는 습관에 들기 위해 numpy를 많이 사용합니다. 나는 그것을 편집했다 –

0

이 알고리즘은 방문 중첩 된 목록 불분명하고 하나를 추가하는 경우 알려주세요 재귀의 각 레벨. 호출 체인이 같다 : 어떤 요소가리스트 없으므로

depth([1, 2, [3, [4, 5], 6], 7]) = 
    1 + depth([3, [4, 5], 6]) = 3 
     1 + depth([4, 5]) = 2 
      1 

깊이 때문에 ([4,5])는 상기베이스 케이스 인 외부 창에서 1 반환 if type(c) == type(nesting) 상태로 진입하지 않는다.

주어진 깊이에 대해 둘 이상의 중첩 목록이있는 경우 [1, [2, 3], [4, [5, 6]]의 경우 최대 깊이가 [2,3]이고 [4, [5, 6]] 인 깊이 호출에 추가됩니다.이 중 최대는 내부 반환에 의해 반환됩니다.

1

몇 가지 예부터 시작해 보겠습니다.

먼저, 한 단계의 깊이 만있는 목록을 고려해 보겠습니다. 예를 들어, [1, 2, 3].

위의 목록에서 코드는 depth()L = [1, 2, 3]으로 시작합니다. 빈 목록 nesting을 만듭니다. L의 모든 요소 (예 : 1, 2, 3)를 반복하고 테스트에 통과하는 단일 요소를 찾지 않습니다. type(c) == type(nesting). len(nesting) > 0이 실패하고 코드가 목록의 깊이 인 1을 반환하는지 확인합니다.

다음은 깊이 2 인 예를 들어 봅시다. 즉, [[1, 2], 3]입니다. 함수 depth()L = [[1, 2], 3]으로 호출되고 빈 목록 nesting이 생성됩니다. 루프는 L의 두 요소, 즉 [1, 2] , 3을 반복하며 type([1, 2]) == type(nesting)부터 nesting.append(depth(c))이 호출됩니다. 이전 예와 마찬가지로 depth(c)depth([1, 2])은 1을 반환하고 nesting은 이제 [1]이됩니다. 루프가 실행 된 후 코드는 len(nesting) > 0 테스트를 평가하며 결과는 True이고 1 + max(nesting)1 + 1 = 2이 반환됩니다.

마찬가지로 코드는 깊이 3에 이어지는 식입니다.

희망이있었습니다.

+0

고마워, 이것도 도움이되는 대답이었다 – Austin

+0

당신을 진심으로 환영한다. :) –