我需要创建一个将字符串转换为无!?., %#$ .
且无大写字母的列表的函数。最后的字符串只是一个示例,因此需要返回['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']
有人可以告诉我为什么我的代码显示None
吗?
def sentence_to_words(s):
# Write the rest of the code for question 2 below here.
s_new= []
s1 = s.split()
a = ['#',',','!','.','?','$']
for i in s.split():
if i in a:
s2 = s1.remove(i)
s_new = s_new.append(s2)
return s_new
print sentence_to_words("Mr. Stark... I don't feel so good")
答案 0 :(得分:0)
调试此问题的最佳方法是验证您对程序状态的假设是否适用于每个步骤。在确定每一行代码都符合您的期望之前,请不要跳过。在循环中添加打印内容可以准确显示每次迭代中的i
:
Mr.
Stark...
I
don't
feel
so
good
这些单词都不在a = ['#',',','!','.','?','$']
中,因此循环内的条件块永远不会运行。循环结束后,您的程序返回None
,当未指定返回值时,Python函数将返回该值。
此外,您的条件块操作无法按预期工作;检查返回值,如果它们是就地操作(例如.append()
),则应避免进行分配,该操作会返回None
,并且不应分配给任何东西。另外,如果if
块确实执行了,则会过早return
返回结果,而不会完成其余列表的工作。
您可能正在寻找这样的东西:
def sentence_to_words(s):
s_new = []
ignore = ["#", "!", ",", ".", "?", "$"]
for word in s.split():
cleaned_word = ""
for letter in list(word):
if letter not in ignore:
cleaned_word += letter
s_new.append(cleaned_word.lower())
return s_new
print sentence_to_words("Mr. Stark... I don't feel so good")
输出:
['mr', 'stark', 'i', "don't", 'feel', 'so', 'good']
以上示例中的方法是对单词进行迭代,然后对每个单词中的字母进行迭代以根据要求清理它们,并将清理后的单词添加到结果数组中。请注意描述性的变量名,它有助于理解程序(例如,i
实际上是代码中的一个单词,但是i
通常表示整数或索引)。
上面的示例可以进行优化-它使用了许多容易出错的数组和循环,忽略列表应该是使函数可重用的参数,并且in
运算符在列表上的速度很慢({ {1}}应该是集合。使用正则表达式使其成为一线式:
ignore
或使用import re
def sentence_to_words(s):
return re.sub(r"[\#\,\!\.\?\$]", "", s).lower().split()
和要忽略的字符列表作为默认参数:
filter
答案 1 :(得分:0)
我不太了解您的代码,但是哪里可以使用re.sub
和split()
。
我们首先使用re.sub
删除所有特殊字符,然后使用split
获得单词列表,即:
import re
sentence = "Mr. Stark... I don't feel so good"
words = re.sub(r"[#,!\?\$.]", "", s).split()
使用re.split
:
words = re.split("[^a-z'-]+", sentence, 0, re.IGNORECASE)
两个示例输出:
# ['Mr', 'Stark', 'I', 'don't', 'feel', 'so', 'good']