2014-07-07 111 views
0

我已經複製了下面的代碼,命名中的一些修改來解決問題,如上所述:給定一個字符串s,返回一個字符串,其第一個字符的所有出現已更改爲'*',除不要更改第一個字符本身。例如'bab''產生'ba ** le'。假設字符串長度爲1或更多。這是代碼:我的問題是,當我通過「Lulla」時,爲什麼我沒有看到「Lu ** a」在解釋器中返回,因爲我認爲代碼應該這樣做。在python程序中意外的輸出

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter,'*') 
    return start_letter + rest_letters 

print (fix_start ('Lulla')) 
+0

因爲您用C取代aptial L但其他人很小l –

回答

0

很簡單,其所需的所有是使用lower()upper()要改變字符串的情況下:

start_letter = s[0].lower() 
rest_letters = s[1:].lower() 

輸入:LulLa
輸出:魯**一個

+0

我認爲這是一種奇怪的解釋。出於某種原因,我認爲在輸出中不應該改變第一個字母的情況。 –

+0

@gnibbler,有效點;我將問題解釋爲如何匹配這個詞(無論大小寫)。第一個字符的情況可以在比賽結束後切換回原來的'return s [0] + rest_letters'。 –

1

會發生什麼事是,Python是區分大小寫。換句話說:

'L' != 'l' 

所以,當你做

rest_letters = rest_letters.replace(start_letter,'*') 

它將取代的只有L所有出現,但不能同時Ll

你能做什麼?不區分大小寫的替換過程有點複雜,您可以在these answers中看到。但是,在你的情況下,這可能工作:

rest_letters = rest_letters.replace(start_letter,'*').replace(start_letter.lower(), '*') 
+0

'「luLLa」'?你應該使用'start_letter.upper()'來掩蓋這種可能性 –

0

在代碼中,你是在字符串的其餘部分更換的第一個字母「L」的任何實例。在例子「Lulla」的例子中,第一個字母是大寫字母「L」,並且不等於「l」。因此,我會嘗試以下方法:如果你有一個保證是語法正確的字符串(如在單詞中間沒有大寫字母)

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter.lower(),'*') 
    return start_letter + rest_letters 

上述解決方案將工作。

如果不能保證,繼續前進,嘗試這個辦法:

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter.lower(),'*') 
    rest_letters = rest_letters.replace(start_letter, '*') 
    return start_letter + rest_letters 
0

其實你試圖取代L但人物的其餘均爲小l。嘗試使用正則表達式,使這個任務很容易。

import re 
def fix_start(s): 
    start_letter = s[0] 
    regex = s[0].lower()+"|"+s[0].upper() 
    rest_letters = s[1:] 
    rest_letters = re.sub(regex, "*", rest_letters) 
    return start_letter + rest_letters 

print (fix_start ('Lulla'))