【问题标题】:Capitalizing the beginning of sentences in Python在 Python 中将句子的开头大写
【发布时间】:2018-07-27 15:48:23
【问题描述】:

以下代码用于要求用户输入一串句子并且每个句子的开头由函数大写的作业。 例如,如果用户输入:'hello.这些是例句。有三个。 输出应该是:'你好。这些是例句。一共有三个。'

我创建了以下代码:

def main():
    sentences = input('Enter sentences with lowercase letters: ')
    capitalize(sentences)

#This function capitalizes the first letter of each sentence
def capitalize(user_sentences):
    sent_list = user_sentences.split('. ')
    new_sentences = []
    count = 0

    for count in range(len(sent_list)):
        new_sentences = sent_list[count]
        new_sentences = (new_sentences +'. ')
        print(new_sentences.capitalize())

main()

此代码有两个问题,我不知道如何更正。首先,它将每个句子打印为一个新行。其次,它在末尾增加了一个额外的句点。使用上面的示例输入,此代码的输出将是:

你好。
这些是例句。
他们三个..

有没有办法将输出格式化为一行并删除最后一个句点?

【问题讨论】:

标签: python string function loops split


【解决方案1】:

以下内容适用于相当干净的输入:

>>> s = 'hello. these are sample sentences. there are three of them.'
>>> '. '.join(x.capitalize() for x in s.split('. '))
'Hello. These are sample sentences. There are three of them.'

如果句号周围有更多不同的空白,您可能需要使用一些更复杂的逻辑:

>>> '. '.join(x.strip().capitalize() for x in s.split('.'))

这将可能是也可能不是您想要的空白规范化。

【讨论】:

    【解决方案2】:
    def main():
        sentences = input('Enter sentences with lowercase letters: ')
        capitalizeFunc(sentences)
    
    def capitalizeFunc(user_sentences):
        sent_list = user_sentences.split('. ')
        print(".".join((i.capitalize() for i in sent_list)))
    
    main()
    

    输出:

    Enter sentences with lowercase letters: "hello. these are sample sentences. there are three of them."
    Hello.These are sample sentences.There are three of them.
    

    【讨论】:

      【解决方案3】:

      我认为这可能会有所帮助:

      >>> sentence = input()    
      >>> '. '.join(map(lambda s: s.strip().capitalize(), sentence.split('.')))
      

      【讨论】:

        【解决方案4】:
        >>> s = 'hello. these are sample sentences. there are three of them.'
        >>> '. '.join(map(str.capitalize, s.split('. ')))
        'Hello. These are sample sentences. There are three of them.'
        

        【讨论】:

          【解决方案5】:

          此代码有两个问题,我不知道如何更正。首先,它将每个句子打印为一个新行。

          那是因为您打印每个句子时都单独调用 print。默认情况下,print 添加一个换行符。如果您不想这样做,可以使用 end 关键字参数覆盖它添加的内容。如果您根本不希望它添加任何内容,只需使用end=''

          其次,它在末尾添加了一个额外的句点。

          这是因为您明确地在每个句子中添加了句点,包括最后一个。

          解决此问题的一种方法是跟踪索引以及循环遍历它们的句子——例如,使用for index, sentence in enumerate(sentences):。然后,如果索引不是最后一个,则仅添加句点。或者,更简单一点,如果索引不为零,则在开始处添加句点。

          但是,有一个更好的方法可以解决这两个问题。您通过在'. ' 上拆分将字符串拆分为句子。您可以通过完全相反的操作将这些句子重新组合成一个大字符串:

          sentences = '. '.join(sentences)
          

          那么你就不需要循环了(当然join 里面隐藏了一个循环),你不必担心将最后一个或第一个循环特殊处理,你只有一个print 而不是一个一堆,所以你不必担心end。

          另一个技巧是让print 的聪明才智为你工作,而不是与之抗争。它不仅默认在末尾添加换行符,还允许您打印多个内容并默认在它们之间添加空格。例如,print(1, 2, 3) 或等价的print(*[1, 2, 3]) 将打印出1 2 3。你可以用任何你想要的东西覆盖那个空格分隔符。所以你可以print(*sentences, sep='. ', end='') 一口气得到你想要的东西。但是,对于阅读您的代码的人来说,这可能有点不透明或过于聪明。就我个人而言,每当我可以使用 join 代替(通常是这样)时,我都会这样做,即使它需要更多的输入,因为它可以让正在发生的事情更加明显。


          附带说明,您的一些代码具有误导性:

            new_sentences = []
            count = 0
          
           for count in range(len(sent_list)):
               new_sentences = sent_list[count]
               new_sentences = (new_sentences +'. ')
               print(new_sentences.capitalize())
          

          那个循环的逻辑很好,但是如果你调用一个新句子变量new_sentence而不是new_sentences,并且没有将它设置为一个空列表,它会更容易理解开始。实际上,读者会被引导期望您将建立一个新句子列表,然后用它做一些事情,但实际上您只是在开始时将这个列表扔掉,并一个一个地处理每个句子。

          而且,虽然我们在这里,但您在这里不需要count;直接循环sent_list:

          for sentence in sent_list:
              new_sentence = sent + '. '
              print(new_sentence.capitalize())
          

          这与您拥有的代码执行相同的操作,但我认为它更容易理解它是通过快速浏览来实现的。

          (当然,您仍然需要修复您的两个问题。)

          【讨论】:

            【解决方案6】:

            使用nltk.sent_tokenize 将字符串标记为句子。和capitalize 每句话,再加入他们。

            句子不能总是以. 结尾,也可以有其他内容,例如? 或!。同样三个连续的点...,不会结束句子。 sent_tokenize 将处理所有这些。

            from nltk.tokenize import sent_tokenize
            
            def capitalize(user_sentences):
                sents = sent_tokenize(user_sentences)
                capitalized_sents = [sent.capitalize() for sent in sents]
                joined_ = ' '.join(capitalized_sents)
                print(joined_)
            

            您的句子被打印在不同的行上的原因是,print 总是以换行符结束其输出。因此,在循环中单独打印句子将使它们打印在换行符上。因此,您应该在加入它们后一次打印它们。或者,您可以在 print 语句中指定end='',这样它就不会以换行符结束句子。

            第二件事,关于输出以一个额外的句点结束,是因为您在每个句子中附加了'. '。 sent_tokenize 的好处是,它不会从句子末尾删除“.”、“?”等,因此您不必再次手动在末尾附加 '. '。相反,您可以只用空格字符连接句子,就可以了。

            如果遇到nltk 无法识别的错误,可以通过在终端/cmd 上运行pip install nltk 来安装它。

            【讨论】:

              猜你喜欢
              • 2014-04-26
              • 1970-01-01
              • 2020-08-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-24
              • 2021-07-05
              • 1970-01-01
              相关资源
              最近更新 更多