以下代码用于分配作业,该作业要求从用户输入一串句子,并且每个句子的开头均由函数大写。 例如,如果用户输入:'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()
此代码有两个我不确定如何更正的问题。首先,它将每个句子打印为新行。其次,它在末尾增加了一个额外的时间段。使用上面的示例输入,此代码的输出为:
你好。
这些是例句。
一共有三个。
是否可以将输出格式化为一行并删除最后一个句点?
答案 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.'