大写Python句子的开头

时间:2018-07-27 15:48:23

标签: python string function loops split

以下代码用于分配作业,该作业要求从用户输入一串句子,并且每个句子的开头均由函数大写。 例如,如果用户输入:'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()

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

  

你好。
  这些是例句。
  一共有三个。

是否可以将输出格式化为一行并删除最后一个句点?

6 个答案:

答案 0 :(得分:4)

以下内容适用于合理整洁的输入:

>>> 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('.'))

哪个规范化空白可能是您想要的,也可能不是您想要的。

答案 1 :(得分:1)

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.

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

  

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

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

  

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

那是因为您要为每个句子(包括最后一个句子)明确添加句点。

解决此问题的一种方法是在遍历索引和句子时跟踪索引,例如使用for index, sentence in enumerate(sentences):。然后,如果索引不是最后一个索引,则仅添加句点。或者,稍微简单一点,如果索引不是零,则在 start 处添加句点。

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

sentences = '. '.join(sentences)

那么,您就不需要循环了(当然join中隐藏了一个循环),您不必担心要处理最后一个或第一个特殊字符,而您只需要一个{{1} },而不是一堆,所以您不必担心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,并且没有将其设置为开始时有一个空列表。实际上,引导读者期望您将要建立一个新句子列表,然后对其进行处理,但是实际上,您只是将该列表一开始就丢弃了,并逐句处理每个句子。 / p>

而且,在进行此操作时,您无需在这里使用new_sentences;只需直接在count上循环即可:

sent_list

这与您拥有的代码具有相同的作用,但是我认为一眼就能想到它就容易理解。

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

答案 4 :(得分:0)

使用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来安装它。

答案 5 :(得分:0)

>>> 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.'