如何小写字符串的第一个字符?


73

有一个大写字符串的函数,我希望能够更改字符串的第一个字符以确保它是小写的。

如何在Python中做到这一点?


4
您确定s.lower()不是您想要的吗?否则,您会得到奇怪的结果,例如“ hELLO”。
Leonid Shvechikov

3
hELLO是我一直在寻找的东西。
纳蒂姆

Answers:


75

一线处理空字符串和None

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

>>> func(None)
>>> ''
>>> func('')
>>> ''
>>> func('MARTINEAU')
>>> 'mARTINEAU'

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

有没有一种方法可以将其编辑为小写字母而不仅仅是首字母?我以为我可以做类似的事情,s = s[10].lower() + s[11:]但这仍然只给我第一个小写字母,而不是前
十个

1
@ christylynn002:您需要使用切片。s = s [:11] .lower()+ s [11:]
maedox

21
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  :-)

4
您最初的答案是完美的,但len(s) == 0简直就是骗子。
SilentGhost 2010年

4
@SilentGhost:这是一百万种有效的表达方式之一。这与要解决的问题有关-如果字符串的长度为零,则不必运行代码,因此这正是我要测试的内容。我可以说,if not s:但这并不能很好地说明问题。
RichieHindle 2010年

6
@SilentGhost:我们都不知道OP的经验。当有人向您提供可以正常工作的代码时,很容易错过一些极端情况。我宁愿在谨慎方面犯错,也不愿提供我知道在常见情况下会失败的答案。
RichieHindle

4
像这样的彻底答案往往比简洁的答案更好地教育问问者。考虑到质询者在问这个问题,有理由指出这种情况。询问者在将来执行类似功能时可以摆脱答案,并牢记这一点,这是一种额外的知识。
JoshD

4
@RichieHindle:如果使用切片,则可以省略零长度字符串的测试:s[:1].lower() + s[1:]也适用于空字符串。我同意无需处理“无”。
Bernd Petersohn

9

有趣的是,这些答案都没有与完全相反capitalize()。例如,capitalize('abC')返回Abc而不是AbC。如果您想要的相反capitalize(),则需要类似:

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

我认为这不是OP的意图
Xavier Combelle

1
@Xavier:您可能是对的,但是有趣的是capitalize其余的字符串都没有用。
Adrian McCarthy

7

最简单的方法:

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

更新资料

请参阅此答案(@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("")
>>> 

嗯 我也想知道为什么这被否决了。如果有错误,我将是第一个想知道的人。
Manoj Govindan

4
这是一个错误-如果您输入一个空字符串,则返回None,因为您有一个空的return语句。这是不直观的,并且必然导致调用代码中的错误。
Dave Kirby

5

无需处理特殊情况(我认为对称性更像Pythonic):

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

7
.upper()您的功能中不应有此功能。
金牛座奥尔森

2
容易出错,请在执行操作之前检查s的长度
harshil9968

0

我会这样写:

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

这具有(相对)优点,如果您不经意地将其传递给了非字符串(例如,None或空列表)之类的东西,则会引发错误。


它将如何引发其他解决方案无法做到的例外?发生错误的第一个机会是切片时,其他所有切片都会这样做。
aaronasterling

并非如此-例如,如果您将空白列表传递给它,那么接受的答案不会引发异常。
罗伯特·罗斯尼

0

这篇重复的帖子将我引到了这里。

如果您有一个字符串列表,如下所示

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

然后,要转换列表中所有项目的首字母,您可以使用

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

输出量

['sentMessage', 'deliverySucceeded', 'deliveryFailed']

在这种情况下,您甚至不需要使用枚举:l = [x[0].lower() + x[1:] for x in list(l)]
Natim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.