2017-07-25 53 views
0

我正在寫一個函數來檢查字符串中'a'和'b'之間的距離是否爲3,使用以下函數。對於輸入字符串「Laura sobs」,'s'的值被存儲爲1(最早出現的'a')而不是4(最後一次出現'a'),並且我得到錯誤的輸出。我該如何解決?Python:存儲最早發生的字符索引,而不是最後一個

def ABCheck(str): 
    for i in str: 
     if i == 'a': 
      s = str.index(i) 
     elif i == 'b': 
      t = str.index(i) 
      # print (b) 
    return (abs(s-t)==4) 

回答

0

使用enumerate來循環字符串,同時保持索引。然後,當你找到'a'時,只要檢查角色3的位置是否是'b'即可。

def abcheck(s): # Don't use str, it's the name of a builtin 
    for idx, c in enumerate(s[:-3]): # No need to iterate over the last part 
     if c == 'a' and s[idx+3] == 'b': 
      return True 
    return False 
+0

感謝@RemcoGerlich,它在我使用'枚舉'但'enumerate(s [:3])'不起作用時起作用。你能解釋這部分嗎? 「你不需要重複最後一部分」是什麼意思?是的,我不使用'str'作爲變量名,它來自網站:) – Sri

+0

我的意思是'-3'。因爲如果你在最後三個字符中找到一個'a',那麼沒有足夠的空間讓'b'有三個字符,所以不需要檢查它們(否則你必須確保你不要在字符串結束之後的索引)。 – RemcoGerlich

+0

非常感謝!我學到了枚舉函數是多麼有用:)只是一個小修正,它應該是'4'而不是'3'並且添加s [idx-4] =='b'與'或' – Sri

0

你的代碼看起來非常硬編碼到只檢查的實例,其中的區別是3和字母必須是「A」或「B」,而不是輸入從某處。

如果您是初學者嘗試構建某些東西,我認爲這不是一個好習慣。但是,如果你很確定這就是你想要的東西(一個函數,只處理這個特定的情況下),然後通過各種手段:

def ABCheck(str): 
    s = -1 
    t = -1 
    for i in str: 
     if i == 'a' and s == -1: 
      s = str.index(i) 
     elif i == 'b' and t == -1: 
      t = str.index(i) 
      # print (b) 
    return (abs(s-t)==3) 

只是初始化都爲-1,並檢查它。一旦它們的值第一次被覆蓋,它們將不再更新。

編輯:

def ABCheck(string): 
    s = -1 
    t = -1 
    for i in string: 
     if i == 'a' and s == -1: 
      s = string.index(i) 
     elif i == 'b' and t == -1: 
      t = string.index(i) 
      # print (b) 
    return (abs(s-t)==4) 

它不會因爲你的代碼工作(這是我抄)最初使用STR這是一個保留關鍵字。

+0

不,它不工作!這是來自coderbyte的代碼挑戰,它必須專門檢查字符串中'a'和'b'位置之間的差異是否爲3,這就是爲什麼它是硬編碼的:) – Sri

+0

@Sri它不起作用,因爲您的代碼(我複製)最初使用str是一個保留關鍵字。你可能真的試圖自己調試它,這不是什麼重大的事情。此外,下次確保您上傳的代碼確實如您所描述的那樣工作。 –

相關問題