2013-06-04 9 views
0

나는 둥지 목록에있는 항목의 수를 계산하는 방법을 알아 내려고하고 있습니다. 나는 심지어 이것을 시작하는 방법에 갇혀있다. 예를 들어 만약 내가 NestLst을 할 수 있었다 ([])는 0을 인쇄 할 것이다 그러나 나는둥지 목록에서 항목을 계산하는 방법?

NestLst([[2, [[9]], [1]], [[[[5]]], ['hat', 'bat'], [3.44], ['hat', ['bat']]]] 

을 할 경우는 9.에게 방법이 좋은 것입니다 수행하는이 또는를 시작하는 방법에 어떤 도움을 반환합니다.

감사합니다.

+0

'lst [i] == list'에 의해, 아마도'type (lst [i]) is list'를 뜻하며'isinstance (lst [i], list)'로 더 잘 표현됩니다. – Eric

답변

0

귀하의 질문에 키워드 : 반복적으로이 포함되어 있습니다. 목록을 반복하는 함수를 작성합니다. 목록이 아닌 항목을 발견하면 개수에 하나를 더하고 목록을 찾으면 스스로를 재귀 적으로 호출합니다.

코드에서 재귀 호출 대신 길이를 사용하는 문제가 발생합니다. 당신은 재귀 적 reduce()를 호출을 시도 할 수

def count(list): 
    answer = 0 
    for item in list: 
     if item is not a list: 
      answer += 1 
     else: 
      answer += number of items in the sublist (recursion will be useful here) 
1
import collections 
def NestLst(seq): 
    if isinstance(seq, str) or not isinstance(seq, collections.Iterable): 
     return 1 
    return sum(NestLst(x) for x in seq) 

>>> NestLst([[2, [[9]], [1]], [[[[5]]], ['hat', 'bat'], [3.44], ['hat', ['bat']]]]) 
9 
1
def total_length(l): 
    if isinstance(l, list): 
     return sum(total_length(x) for x in l) 
    else: 
     return 1 
0

:

는 여기 파이썬 의사입니다. 뭐 그런 :

>>> def accumulator(x,y): 
...  if isinstance(y, list): 
...   return reduce(accumulator,y,x) 
...  else: 
...   return x+1 
... 
>>> reduce(accumulator, [10,20,30,40] ,0) 
4 
>>> reduce(accumulator, [10,[20,30],40] ,0) 
4 
>>> reduce(accumulator, [10,20,30,40,[]] ,0) 
4 
>>> reduce(accumulator, [10,[20,[30,[40]]]] ,0) 
4 
>>> reduce(accumulator, [10*i for i in range(1,5)] ,0) 
4 

일부 사항 :

  • 빈 컬렉션이 0 항목에 대해 계산됩니다 (마지막 예제 참조) 끝에
  • 0하여 reduce() 호출이 초기 값입니다. 이것은 생략 할 때 여전히 유효한 전화가 있기 때문에 함정이 될 수 있지만 결과는 원하는 것이 아닙니다. 유틸리티 함수에서 초기 호출을 래핑하는 것이 좋습니다.
관련 문제