【问题标题】:How to downcase the first character of a string?如何小写字符串的第一个字符?
【发布时间】:2010-10-01 15:52:28
【问题描述】:

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

如何在 Python 中做到这一点?

【问题讨论】:

  • 你确定 s.lower() 不是你想要的吗?否则你可能会得到奇怪的结果,比如'hELLO'。
  • hELLO 是我想要的。

标签: python string


【解决方案1】:

处理空字符串和None:

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

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

【讨论】:

  • 我发现 lambda 的可读性远低于常规函数定义。你真的认为只保存一行就值得吗?
  • @MarkRansom:恰恰相反,我觉得这很有可读性。 YMMV。
  • 是的,我会给你那个 YMMV。但是由于我心情不好,所以即使它不是字符串,此函数也会为 any 错误输入返回一个空字符串,这是否会打扰您?例如0[]False
  • @serv-inc 完全不清楚你想告诉我什么。
  • @serv-inc 我不认为这是一种改进。感谢您的尝试。
【解决方案2】:
s = "Bobby tables"
s = s[0].lower() + s[1:]

【讨论】:

  • 有没有办法可以将其编辑为小写而不仅仅是第一个字母?我以为我可以做类似s = s[10].lower() + s[11:] 之类的事情,但这仍然只给了我第一个小写字母而不是前 10 个。
  • @christylynn002:你需要使用切片。 s = s[:11].lower() + s[11:]
【解决方案3】:
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  :-)

【讨论】:

  • 你原来的答案是完美的,但len(s) == 0 很奇怪。
  • @SilentGhost:这是一百万种有效的表达方式之一。它与它要解决的问题有关 - 如果字符串长度为零,则不能运行代码,所以这就是我正在测试的明确内容。我本可以说if not s:,但这并不能很好地代表问题。
  • @SilentGhost:我们都不知道 OP 的经验如何。当有人为您提供可证明有效的代码时,很容易错过极端情况。我宁愿谨慎行事,也不愿提供我知道在常见情况下会失败的答案。
  • 这样的详尽答案往往比简洁的答案更能教育提问者。鉴于提问者在问这个问题,指出极端情况是合理的。这是一个额外的知识点,提问者可以从答案中提取出来,并在他将来制作类似的功能时牢记。
  • @RichieHindle:如果使用切片,则可以省略对零长度字符串的测试:s[:1].lower() + s[1:] 也适用于空字符串。我同意没有必要处理None。
【解决方案4】:

有趣的是,这些答案都完全capitalize()相反。例如,capitalize('abC') 返回 Abc 而不是 AbC。如果你想要 capitalize() 的反义词,你需要这样的东西:

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

【讨论】:

  • 我不认为这是 OP 的意图
  • @Xavier:你可能是对的,但有趣的是capitalize 与字符串的其余部分混在一起。
【解决方案5】:

最简单的方法:

>>> 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("")
>>> 

【讨论】:

  • 是的。我也想知道为什么这被否决了。如果有错误我会第一个想知道。
  • 有一个错误 - 如果你传入一个空字符串,你会得到 None 返回,因为你有一个空的 return 语句。这是不直观的,并且必然会导致调用代码中的错误。
【解决方案6】:

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

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

【讨论】:

  • 你的函数中不应该有.upper()
  • 容易出错,操作前检查s的长度
  • @harshil9968 Python 中切片的真正优点之一是,即使索引超出范围,它们也能正常工作。你可能会得到一个空字符串,但它仍然有效。
【解决方案7】:

我会这样写:

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

这有一个(相对的)优点,如果你不小心传递了一些不是字符串的东西,比如None或一个空列表,它会抛出一个错误。

【讨论】:

  • 它将如何引发其他解决方案不会引发的异常?出错的第一个机会是当你切片并且所有其他人都这样做时。
  • 不是这样 - 例如,如果您向其传递一个空列表,则接受的答案不会引发异常。
【解决方案8】:

这个重复的post 带我到这里。

如果您有如下所示的字符串列表

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)]
【解决方案9】:

先点安装pydash

import pydash  # pip install pydash

assert pydash.lower_first("WriteLine") == "writeLine"

https://github.com/dgilland/pydash

https://pydash.readthedocs.io/en/latest/

https://pypi.org/project/pydash/

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2014-03-12
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多