2010-10-01 44 views
39

有一個函數可以大寫字符串,我希望能夠改變字符串的第一個字符以確保它是小寫字母。如何降低字符串的第一個字符?

我該怎麼用Python做到這一點?

+3

你確定s.lower()不是你想要的嗎? 否則你可能會得到奇怪的結果,比如'hELLO'。 – 2010-10-01 16:57:51

+1

'hELLO'就是我一直在尋找的東西。 – Natim 2013-07-31 08:03:21

回答

41

一個班輪它處理空字符串和None

func = lambda s: s[:1].lower() + s[1:] if s else '' 

>>> func(None) 
>>> '' 
>>> func('') 
>>> '' 
>>> func('MARTINEAU') 
>>> 'mARTINEAU' 
18
def first_lower(s): 
    if len(s) == 0: 
     return s 
    else: 
     return s[0].lower() + s[1:] 

print first_lower("HELLO") # Prints "hELLO" 
print first_lower("")  # Doesn't crash :-) 
+3

你的原始答案是完美的,但'len(s)== 0'只是bizzare。 – SilentGhost 2010-10-01 15:57:18

+3

@SilentGhost:這是百萬種有效的方式之一來說出它的意思。這與它需要解決的問題有關 - 如果字符串長度爲零,則不得運行代碼,因此明確地說明了我正在測試的內容。我可以說'如果不是s:',但這並不代表問題相當好。 – RichieHindle 2010-10-01 16:00:57

+2

我寧願'如果不是len(s)'個人,但這只是挑剔 – Daenyth 2010-10-01 16:10:11

3

最簡單的方法:

>>> mystring = 'ABCDE' 
>>> mystring[0].lower() + mystring[1:] 
'aBCDE' 
>>> 

更新

一個更加萬無一失的解決方案見this answer(由@RichieHindle),包括處理空字符串。這個問題的答案不處理None的,所以這是我的看法:

>>> def first_lower(s): 
    if not s: # Added to handle case where s == None 
    return 
    else: 
     return s[0].lower() + s[1:] 

>>> first_lower(None) 
>>> first_lower("HELLO") 
'hELLO' 
>>> first_lower("") 
>>> 
+0

是的。我也想知道爲什麼這是投票。如果出現錯誤,我會首先想知道。 – 2010-10-01 17:08:20

+3

有一個錯誤 - 如果你傳入一個空字符串,你會返回None,因爲你有一個空的return語句。這是不直觀的,必然會導致調用代碼中的錯誤。 – 2010-10-02 20:24:41

16
s = "Bobby tables" 
s = s[0].lower() + s[1:] 
+4

+1 Bobby桌子:) – Skilldrick 2010-10-01 15:58:52

+1

'一個媽媽的利用:) :) – st0le 2010-10-01 18:48:11

+0

有沒有辦法可以編輯這個小寫字母而不僅僅是第一個字母?我想我可以做一些像's = s [10] .lower()+ s [11:]'這樣的東西,但是這仍然只給我第一個字母而不是第一個字母。 – cosmictypist 2016-01-08 15:06:40

7

有趣的是,所有這些答案不準確capitalize()相反。例如,capitalize('abC')返回Abc而不是AbC。如果你想的capitalize()相反,你需要的東西,如:

def first_lower(s): 
    if s == "": 
     return s 
    return s[0].lower() + s[1:] 

這樣做的(相對)的優點在於它會拋出,如果你的錯誤:

def uncapitalize(s): 
    if len(s) > 0: 
    s = s[0].lower() + s[1:].upper() 
    return s 
+0

我不認爲這是OP – 2010-10-01 17:32:58

+1

@Xavier的意圖:你可能是對的,但有趣的是,大寫字母與剩下的字符串混合在一起。 – 2010-10-01 22:04:31

+0

是的,這很有趣,值得你的+1 – 2010-11-12 16:52:19

0

我這樣寫無意中將它傳遞給不是字符串的東西,如None或空列表。

+0

它將如何引發一個例外,其他解決方案不會?第一次發生錯誤的機會是當你切片時,所有其他人都會這樣做。 – aaronasterling 2010-10-02 06:08:35

+0

並非如此 - 例如,如果您將空白列表傳遞給接受的答案,則不會引發異常。 – 2010-10-02 09:19:13

3

無需處理特殊情況(我認爲的對稱性是更Python):

def uncapitalize(s): 
    return s[:1].lower() + s[1:].upper() 
+5

函數中不應該有'.upper()'。 – 2015-05-13 15:49:12

+1

在執行操作之前很容易出錯,檢查s的長度 – harshil9968 2016-12-28 08:29:45

0

此複製post帶領我這裏。

如果你已經像下面

l = ['SentMessage', 'DeliverySucceeded', 'DeliveryFailed'] 

所示。然後,在列表中的所有項目的第一個字母轉換爲一個字符串列表,你可以使用

l = [x[0].lower() + x[1:] for x in l] 

輸出

['sentMessage', 'deliverySucceeded', 'deliveryFailed'] 
+0

在這種情況下,甚至不需要使用枚舉:列表中的x爲l = [x [0] .lower()+ x [1: l)]' – Natim 2017-11-14 09:32:00

+0

@Natim謝謝!只是意識到我不需要'我'! – 2017-11-14 09:35:46

相關問題