2016-08-15 13 views
0
나는 기능의 목록 입력 내림차순 순서가 아닌 경우는 false를 돌려 기능을 만들고 싶어

,파이썬 내림차순 내림차순 이제 목록

는 ([19,17,18,7])가 true를 돌려

이유가 무엇인지 모르겠지만 언제든지 if 문을 종료하고 매번 true로 인쇄됩니다.

def des(l): 
    for i in range(len(l)): 
      if (l[i]<l[i+1]): 
       return [False,i] 
      else: 
       return True 
+0

인덱스 범위를 벗어난 오류가 발생하지 않습니까? 그것은해야 할 것 같습니다 .. – Aaron

+1

오류를 나타내는 짧은 ** 완벽한 ** 프로그램을 제공해주십시오. 당신의 프로그램은 a) 결코'des()'를 호출하지 않고, b) 결코 아무것도 인쇄하지 않습니다. 자세한 내용은 [mcve]를 참조하십시오. –

+0

또한 귀하가 궁금해하는 것이 명확하지 않습니다. 질문 할 질문이 있습니까? –

답변

0

이 밖으로 시도 :

def des(l): 
    for x in l: 
     try: 
      if x < l[l.index(x)+1 ]-1: 
       return True 
     except: 
      pass 
    return False 
+1

이 코드 단편은 질문을 해결할 수 있지만 [설명 포함] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 정말 게시물의 품질을 향상시키는 데 도움이됩니다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. 또한 주석을 설명하기 위해 코드를 군중시키지 마십시오. 그러면 코드와 설명 모두 가독성이 떨어집니다! – gunr2171

3

그것은 더 선언적 방식으로 작성 될 수있다 : python3를 들어,

def is_descending(array): 
    return array == sorted(array, reverse=True) 

또는 :

def is_descending(array): 
    return array == list(sorted(array, reverse=True)) 
2

코드는 아무튼 네가 돌아 오기 때문에 일하지 않아.한 번 확인한 후/False 전체 목록을 확인한 후에 만 ​​True을 반환해야합니다. 여기

def des(l): 
    for i in range(1,len(l)): 
     if (l[i] > l[i-1]): 
      return False 
    return True 

l = [19,17,12,10] 


print (des(l)) 
1

함수를 작성하는 또 다른 방법은 다음과 같습니다 :

def des(l): 
    return all(i>j for i,j in zip(l,l[1:])) 
1

문제는 당신이 오직 하나 개 점검을하고, 항상 즉시 반환 True 또는 것입니다 다음 그 일을하는 한 가지 방법은 False.

def des(l): 
    for i in range(len(l)): 
     if (l[i]<l[i+1]): 
      return [False,i] 
    return True 

이 당신에게 또 다른 문제를 줄 것이다 그러나 : 당신이 전체 목록을 확인할 때까지

대신`진정한 반환하지 않아야

>>> des([4,3,2,1]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in des 
IndexError: list index out of range 

이 때를하기 때문에 range에서 마지막 값을 얻으려면 목록의 끝을 넘어서는 값을보십시오. 그 문제를 해결하는 가장 쉬운 방법은 범위에서 하나를 빼기하는 것입니다 : 파이썬에서

def des(l): 
    for i in range(len(l) - 1): 
     if (l[i]<l[i+1]): 
      return [False,i] 
    return True 

, 그것은 range(len(...))를 사용하는 일반적으로 나쁜 습관이다. 더 나은 옵션은 (index, value)쌍 시퀀스를 반환 enumerate이지만, 그 위의 문제가 해결되지 않습니다

def des(l): 
    for i, v in enumerate(l): 
     if (v < l[i+1]): 
      return [False,i] 
    return True 

이 여전히 IndexOutOfRange의 오류가 있습니다. 우리는 목록을 척에 의해 우리가 이상 반복하는 것은 하나의 짧은 것을 해결할 수 :

def des(l): 
    for i, v in enumerate(l[:-1]): 
     if (v < l[i+1]): 
      return [False,i] 
    return True 

그리고 거기 당신은 훨씬 더 "파이썬"(스타일로 파이썬 전문가 할 것 즉) 해결책을 가지고 있습니다.

이 코드에는 다른 문제가 하나 있습니다. if des(my_list)): ...을 수행하면 작동하지 않습니다. 이는 비어 있지 않은 list (return 문에 []을 사용하여 만드는 내용이 인 경우 항상 truthy이기 때문입니다.

오름차순 항목의 색인을 가져 오려면 실제로 그럴 수는 없지만 함수 이름에서 명확하게 지정해야합니다. 당신은 단지 성공 True를 반환하기 때문에

또한,

is_descending, bad_index = des(...) 

할 수 없습니다. 더 나은 내가 그룹 내 결과 쌍을 괄호를 사용하고 있음을

def des(l): 
    for i, v in enumerate(l[:-1]): 
     if (v < l[i+1]): 
      return (False,i) 
    return (True, None) 

참고도 될 것이다,이 새로운 tuple 만듭니다. 일반적으로, list s는 회원의 모든이 같은 일을 나타내는 경우 회원은이 경우와 같이 다른 일을 나타내는 경우, tuple 사용해야 사용해야합니다, 그들은 결과을 나타내며, 오류가 발생했습니다.

0
def des(l): 
    for i in range(len(l)): 
     if (l[i]<l[i+1]): 
      return [False,i] 

    return True 

false가 아니라면 True를 반환하고, for 루프 전체가 돌아 왔을 때만 true를 반환해야합니다. 따라서 for 루프 외부에 있어야합니다. 루프가 끝나고 아무것도 반환되지 않은 경우 True를 반환하면