2016-08-27 1 views
-1
def has22(nums): 
    if nums[len(nums) - 1] == 2: 
    if nums[len(nums) - 2] == 2: 
     return True 
    else: 
    for n in range(len(nums) - 3): 
     if nums[n] == 2 : 
     if nums[n + 1] == 2: 
      return True 
     else: 
     return False 

배열에 2가 2의 옆에 있으면 True를 반환해야합니다. 그러나 그것은 나에게 "범위 밖의 목록 색인"이라고 말하는 오류를줍니다. 무엇을 바꾸어야합니까?CodingBat has22 왜이 솔루션이 잘못 되었습니까?

나는이 새로운 것들에 익숙하지 않기 때문에 아마도 나의 코드는 그것을 해결할 수있는 가장 긴 방법 중 하나 일 것이다. 그러나 나는 어떤 도움을 주셔서 감사한다. 고맙습니다!

+0

전체 오류를 붙여주세요. – Bharel

답변

1

당신이보고 한 오류는 nums이 빈 목록 일 때만 발생할 수 있다고 생각합니다. 이 경우 nums[len(nums) - 1]은 유효한 인덱스가 아닙니다 (빈 목록에 유효한 인덱스가 없기 때문에).

이 문제의 경우 목록의 마지막 두 항목을 특수하게 처리하는 것이 중요하지 않습니다. 목록의 길이가 2보다 작은 경우, 댓글이 말한다

def has22(nums): 
    for n in range(len(nums) - 1): # the loop body will not run if len(nums) < 2 
     if nums[n] == nums[n + 1] == 2: # you can chain comparison operators 
      return True 
    return False # this is at top level (after the loop), not an `else` clause of the if 

, 나는이 목록 인덱스를 사용하는 루프 본문이 실행되지 않습니다 : 당신은 하나 개의 루프 모든 경우를 처리하여 코드를 훨씬 간단하게 만들 수 있습니다 range이 비어 있고 빈 시퀀스를 반복하면 아무것도 수행되지 않기 때문입니다.

num의 두 반복자에서 zip을 사용하는 것이 약간 더 편리 할 수 ​​있습니다.이 반복자는 한 자리 씩 옵셋됩니다.

def has22_fancy(nums): 
    iters = [iter(nums), iter(nums)] 
    next(iters[1], None) 
    return any(a == b == 2 for a, b in zip(*iters)) 

이 접근 방식을이 주어진 년대 itertools documentation, 영감 zip을 사용하여 쌍을 반복하기 : 당신은 아직 그것을 이해하지 않는 경우에, 그것에 대해 너무 많이 걱정하지 않도록 이것은 고급 파이썬 물건 pairwise 레시피 :

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 
관련 문제