编写一个函数来查找句子中某些单词的有效性



一项大学作业要求我们用Python编写一个分析tweet的程序。任务的一部分是编写一个函数来识别字符串句子中的单词是否有效,是否可以计数。问题是:


Task 8 Valid Words

我们还可能希望只查看数据集中的有效单词。如果下列三个条件都为真,则一个词就是一个有效词:

•单词只包含字母、连字符和/或标点符号*(不包含数字)。

•最多有一个连字符"-"。如果存在,则必须用字符("a-b"是有效的,但是"one_answers"ab产生绯闻;

•最多有一个标点符号。如果存在,它必须在单词的末尾("ab,", "cd!"one_answers";都是有效的,但是"a! "one_answers"c。">

注意:对于这个问题,第三个条件也适用于撇号,尽管是real " validate "单词包含他们。

编写一个函数valid_words_mask(sentence),它接受一个输入参数sentence (type string)并返回元组:(int, list[]),其中:

•int是找到的有效单词的数目。

•list[]包含序列中每个单词的布尔值True或False,具体取决于是否

*假设标点符号是任何非字母数字字符(撇号除外)。对于连字符,根据说明分别处理)。


这是我写的代码到目前为止,经过许多天的努力。它似乎只返回循环的一次迭代。请记住,我是一个初级程序员,只应用了我们所学到的一些概念。:(谢谢你的反馈。

def valid_words_mask(sentence):

"""Takes a string sentence input and determines whether words are valid"""
import string
punctuation = list(string.punctuation)
punctuation.remove("-")
word_list = " ".split(sentence)
valid_count = 0
valid_list = []
for word in word_list:
hyphen_count = 0
digit_count = 0
punctuation_count = 0

for i in range (0, len(word)):   

#Checks whether given character is a punctuation mark  

if word[i] == "-":  
hyphen_count += 1  

for i in range (0, len(word)):

#Checks whether given character is a digit

if word[i].isdigit() == True:
digit_count += 1

for i in range (0, (len(word) - 1)):

if word[i] in punctuation:

punctuation_count += 1

if digit_count < 1 and hyphen_count < 2 and punctuation_count < 1:
if word[0] != "-" and word[-1] != "-":
validity = True
else: validity = False

if validity == True:
valid_count += 1

valid_list.append(validity)


final_tuple = (valid_count, valid_list)

return final_tuple



sentence = "these are valid  words"
print(valid_words_mask(sentence))

问题出在这一行:word_list = " ".split(sentence)word_list为空列表

word_list = sentence.split()

这项任务的说明在定义标点符号时令人困惑,这意味着下面的代码可能不适合您。

但是,您应该考虑将功能分解为其组成部分。特别地,你有3条"规则"。写出3个互补函数,每一个都简洁。然后,将这些规则组合成另一个"驱动因素"就容易多了。函数。下面是一个例子:

from string import ascii_lowercase, punctuation
HYPHEN = '-'
PUNCTUATION = punctuation.replace(HYPHEN, '')
VCHARS = ascii_lowercase + punctuation
def valid_chars(word):
return all(c in VCHARS for c in word)
def valid_hyphens(word):
return word.count(HYPHEN) == 0 or (word[0] != HYPHEN and word[-1] != HYPHEN)
def valid_punctuation(word):
pcount = sum(1 for c in word if c in PUNCTUATION)
return pcount == 0 or (pcount == 1 and word[-1] in PUNCTUATION)

def valid_words_mask(sentence):
valid_count = 0
valid_list = list()
for word in sentence.lower().split():
if v := valid_chars(word) and valid_punctuation(word) and valid_hyphens(word):
valid_count += 1
valid_list.append(v)
return valid_count, valid_list
print(valid_words_mask('Hello world??'))

输出:

(1, [True, False])

最新更新