2016-03-24 48 views
-1

嗨我想寫一個函數,它可以告訴你在一個字符串中有多少次不同的相鄰字符退出。即LOLOLO具有不同的相鄰單詞5次。我已經嘗試了很多次,但每一次我跑的時候,我得到錯誤: - 行5,在adjacent_numbers 如果c =字符串[我+ 1]: IndexError:字符串索引超出範圍找到一個字符串中存在多少次不同的相鄰字符

def adjacent_numbers(string): 
    count = 0 
    i = 0 
    for i,c in enumerate(string): 
     if c != string[i+1] : 
      count += 1 
     i += 1 

    return count 
+1

單字或字符?如果出現錯誤,請在問題描述中添加錯誤。 –

+0

通過for循環爲您填寫'i'的值。你可以刪除'i = 0'和'i + = 1'。 –

+0

對不起,它應該是字符 – Reboot

回答

1

錯誤!當你到達字符串的末尾並且詢問不存在的'next'字符時會發生。當i是字符串中的最後一個索引(它將被綁定在循環的結尾處)時,請求string[i+1]是沒有意義的。你可以做的是遍歷字符串減去使用切片符號的最後一個字符:for i, c in enumerate(string[:-1]): ...

+0

感謝它的工作 – Reboot

+0

很高興聽到它!當您看到解決問題的正確答案時,您通常應該點擊答案左側的檢查/勾號標記。 –

0

你不能索引過去的字符串長度,你可以從尾部切片一個string[:-1],但你可以避免切片你可以使用for循環和iter

s = "LOLOLO" 

def adj(s): 
    # iter create an iterator 
    it, sm = iter(s), 0 
    # pull first character and set prev equal to it 
    prev = next(it) 
    # iterate over all bar the first char 
    for ch in it: 
     # if previous is not equal to current char add 1 to sm 
     if ch != prev: 
      sm += 1 
     # set prev to current char 
     prev = ch 
    # catch last char 
    return sm + (prev != ch) 

輸出:

In [3]: adj(s) 
Out[3]: 5 

您也可以欺騙一個位與羅列,您可以用切片,這將不會導致IndexError,你也可以使用builti Ñsum函數來如此計數:

def adj(s): 
    return sum(ch != s[i:i+1] and i < len(s) for i, ch in enumerate(s, 1)) 

print(adj(s)) 

枚舉也需要啓動ARG這是一個在此情況下,所以我們在第二字符開始索引。

應用相同的邏輯來自己的​​循環:

def adjacent_numbers(string): 
    count = 0 
    for i,c in enumerate(string, 1): 
     if i < len(s) and c != string[i:i+1]: 
      count += 1 
    return count 

i在你的代碼並不需要任何所以我刪除它,你就不需要在初始化變量蟒,i將工作在精細循環。

+0

一個聰明的想法,但有點難以閱讀,肯定不適合初學者誰幾乎不能理解循環。短變量名稱不起作用。爲什麼不用'count'而不是'sm'? –

+0

我是python的新手,所以我不太明白代碼是如何工作的。 – Reboot

+0

感謝您的解釋 – Reboot

0

代碼的高爾夫球場......

import operator 
s = 'LOLOLO' 
sum(map(operator.ne, s, s[1:])) 
相關問題