这是一个家庭作业问题。我需要定义一个带有单词和字母的函数,并删除单词中所有出现的字母。我不能使用像正则表达式或字符串库这样的东西。我试过......
def delete(word,letter):
word = []
char = ""
if char != letter:
word+=char
return word
和
def delete(word,letter):
word = []
char = ""
if char != letter: #I also tried "if char not letter" for both
word = word.append(char)
return word
两者都不提供任何输出。我做错了什么?
答案 0 :(得分:4)
好吧,仔细看看你的功能:
def delete(word,letter):
word = []
char = ""
if char != letter:
word+=char # or `word = word.append(char)` in 2nd version
return word
因此,函数会传入一个单词并传入一个字母。你要做的第一件事就是扔掉这个单词,因为你用不同的值(一个新的空列表)覆盖了局部变量。接下来,您正在初始化空字符串char
并将其内容(它为空)与传递的字母进行比较。如果它们不相等,即如果letter
不是空字符串,则char
中的空字符串将添加到(空列表)word
。然后返回word
。
另请注意,您无法将字符串添加到列表中。列表上的+
操作仅用于组合两个列表,因此您的append
版本的定义更少。假设你想要一个字符串作为结果,那么将结果存储为一个开头就更有意义了。
当与传递的单词完全无关的内容发生时,不是将空字符串添加到空字符串/列表中,而是要保持原始单词的完整性并以某种方式查看每个字符。你基本上想要遍历单词并保留所有不是通过字母的字符;像这样的东西:
def delete(word, letter):
newWord = '' # let's not overwrite the passed word
for char in word:
# `char` is now each character of the original word.
# Here you now need to decide if you want to keep the
# character for `newWord` or not.
return newWord
for var in something
基本上将采用序列something
并为该序列的每个值执行循环体,使用变量var
进行标识。字符串是字符序列,因此循环变量将包含单个字符,并且对字符串中的每个字符执行循环体。
答案 1 :(得分:1)
您没有对word
传递给您的函数做任何事情。最终,你需要遍历传递给你的函数(for character in word: doSomething_with_character
)的单词并从中构建你的输出。
答案 2 :(得分:0)
def delete(word, ch):
return filter(lambda c: c != ch, word)
基本上,只是在字符串上进行线性传递,删除与ch
匹配的字母。
filter
采用更高阶函数和iterable
。一个字符串是iterable
,迭代它遍历它包含的字符。 filter
删除了高阶函数返回False
的迭代中的元素。
在这种情况下,我们filter
输出所有等于传递的ch
参数的字符。
答案 3 :(得分:0)
我喜欢功能风格@ TC1和@ user2041448值得了解。这是另一个实现:
def delete( letter, string ):
s2 = []
for c in string:
if c!=letter:
s2.append( c )
return ''.join(s2)
答案 4 :(得分:0)
你的第一个函数使用带有列表的+运算符,这可能不是最合适的选择。 +运算符应该保留为字符串(并使用.append()函数和列表)。
如果目的是返回字符串,分配“”而不是[],使用+运算符。
如果目的是返回字符列表 assign [] ,使用.append()函数。
更改用于构造返回值的变量的名称。
将任何内容分配给单词会删除作为参数赋予函数的内容。
所以让它 result = [] OR result =“”等..
ALSO:
你似乎试图解决这个问题的方式要求你循环遍历原始字符串中的字符,你发布的代码根本不会循环。
你可以使用这种语义的for循环:
for characterVar in stringVar:
controlled-code-here
code-after-loop
你可以/应该更改当然的名字,但我以一种可以帮助你理解的方式命名它们。在你的情况下,stringVar将替换为word,如果它不是删除的字符,你会追加或添加characterVar到结果。您希望包含在循环中的任何代码都必须缩进。控制线后面的第一个未缩进的行向python表明代码在循环之后出现。
答案 5 :(得分:0)
这就是我提出的:
def delete(word, letter):
new_word = ""
for i in word:
if i != letter:
new_word += i
return new_word