这是我必须回答的问题
出于这个问题的目的,我们将一个单词定义为句子,如果该单词后面紧跟一个句点。例如,在文本“这是一个句子。最后一句话有四个单词。“,结尾的单词是'句子'和'单词'。以类似的方式,我们将句子的起始单词定义为句子结尾之前的任何单词。前一个示例文本中的起始单词将为“The”。您不需要将文本的第一个单词视为起始单词。编写一个程序:
一个带有单个字符串参数的endwords函数。此函数必须返回出现在给定字符串中的所有句子结束字的列表。返回的列表中不应有重复的条目,并且句点不应包含在结尾的单词中。
我到目前为止的代码是:
def startwords(astring):
mylist = astring.split()
if mylist.endswith('.') == True:
return my list
但我不知道我是否使用了正确的方法。我需要一些帮助
答案 0 :(得分:3)
您的代码有几个问题。以下是一种简单的方法。创建一个双字母组列表,并选择每个二元组的第二个标记,其中第一个标记以句点结束:
def startwords(astring):
mylist = astring.split() # a list! Has no 'endswith' method
bigrams = zip(mylist, mylist[1:])
return [b[1] for b in bigrams if b[0].endswith('.')]
zip
和list comprehenion是值得一读的两件事。
答案 1 :(得分:1)
mylist = astring.split()
if mylist.endswith('.')
无效,其中一个原因是mylist
是list
,并且没有endswith
作为方法。
另一个答案修复了你的方法,所以让我提出一个正则表达式解决方案:
import re
print(re.findall(r"\.\s*(\w+)","This is a sentence. The last sentence had four words."))
匹配点后面的所有单词和可选空格
结果:['The']
答案 2 :(得分:0)
def endwords(astring):
mylist = astring.split('.')
temp_words = [x.rpartition(" ")[-1] for x in mylist if len(x) > 1]
return list(set(temp_words))
答案 3 :(得分:0)
这是一种方法 - >
#!/bin/env/ python
from sets import Set
sentence = 'This is a sentence. The last sentence had four words.'
uniq_end_words = Set()
for word in sentence.split():
if '.' in word:
# check if period (.) is at the end
if '.' == word[len(word) -1]:
uniq_end_words.add(word.rstrip('.'))
print list(uniq_end_words)
输出(给定句子中所有结束词的列表) - >
['words', 'sentence']
如果你的输入字符串在其中一个单词中有一个句点(比如说最后一个单词),就像这样 - >>
'我喜欢numpy.random.rand的文档。'
输出为 - ['numpy.random.rand']
对于输入字符串'我非常喜欢numpy.random.rand的文档。'
输出为 - ['lot']
答案 4 :(得分:0)
这会创建一个集合,因此没有重复项。然后在句子列表中进行for循环(用“。”分隔),然后对于每个句子,将其分成单词,然后使用[:-1]只生成最后一个单词的列表并获取[0]项目列表。
print (set([ x.split()[:-1][0] for x in s.split(".") if len(x.split())>0]))
理论上不需要if,但没有它我就无法工作。
这也有效:
print (set([ x.split() [len(x.split())-1] for x in s.split(".") if len(x.split())>0]))