2016-05-05 59 views
0

我想檢查一個字符串是否是初學者(按字母順序)。我想檢查一個字符串是否是初學者

def is_abecdarian(s): 
    index = 0 
    while index < len(s)-1: 
     if s[index + 1] > s[index]: 
      return True 
     index += 1 
    return False 
print(is_abecdarian('babcd')) 

如果我切換我的False和True,並切換大於小於它的工作。我不明白的是'a'不大於'b',但是當我運行上面的代碼時,它返回True。

+0

您的循環正在檢查字母順序條件失敗的任何位置。如果在任何一個步驟中,下一個字符的字母順序都比前一個字符小,那麼該字符串就沒有順序,所以函數應該返回false。循環檢查完每個位置後,如果它沒有返回false,那麼它必須全部按順序排列,所以函數應該返回true。 – khelwood

+1

這段代碼沒有意義。你進入循環,然後在第一次迭代時檢查前兩個元素是否有序,如果是,你立即返回'True'而不查看其餘的字符串。爲什麼?這個函數檢查字符串中的任何*連續字符是否按順序排列,如果是,則返回'True'。如果每個連續對都出現故障,它只會返回「False」。 –

回答

1

循環寫入的方式,如果任何一對字符是有序的,它將返回True。如果所有線對都失敗,它只會返回False。第一對ba未通過if檢查,但第二對ab通過且函數返回True。

這是不對的,因爲如果你考慮一下,你不能知道一個字符串是初學者,直到你檢查了所有的字符。當你完成循環時,你應該只返回True。相反,只要找到一對不符合規則的字符,就可以安全地返回False。

這就是爲什麼翻轉布爾值和<操作的原因。

+0

這使得完美的感覺 - 我們必須在我們得出結論之前消除所有的可能性。謝謝! –

5

return True退出功能,所以現在它運行,直到有兩個字母按正確的順序,然後退出。

+0

我假設{return False}不退出函數? –

+0

該功能沒有達到它。當它找到一對正確的字母時它就退出了。 –

+0

如果*每個*索引位置都沒有通過'if'語句,它就會到達它。 – tripleee

0

只有當下一個字符是當前的<時,您才需要返回False。 如果在整個循環中沒有發生這種情況,則返回True。

這裏是正確的功能:

def is_abecdarian(s): 
    index = 0 
    while index < len(s)-1: 
     if s[index + 1] < s[index]: 
      return False 
     index += 1 
    return True 

print(is_abecdarian('babcd')) 
print(is_abecdarian('abcz')) 
+1

雖然'for'語句是循環遍歷單調遞增索引的慣用方式。 – tripleee

0

爲什麼它不工作已經解釋過,所以,只有添加到什麼已經解釋:

def is_abecdarian(s): 
    return all(s[i] < s[i+1] for i in range(len(s)-1)) 

print(is_abecdarian('babcd')) 
print(is_abecdarian('ejmpq')) 

  • all(argument)僅當參數中的所有布爾值爲True時才返回True;

  • s[i] < s[i+1]s的第i個元素與下一個元素之間的比較。

  • s[i] < s[i+1] for i in range(len(s)-1)s的所有連續元素對進行比較。

+0

你能解釋爲什麼OP的代碼不工作,除了他們沒有按照你的方式去做嗎? –

+0

那麼這只是一個補充,因爲它已被解釋。我會在我的回答中加上這個以及解釋。我認爲它帶來了一些東西,因爲它更容易閱讀,從而減少了難以理解的錯誤。 – zezollo

+0

更短,也許更清楚:'所有(a

相關問題