我在Codecademy,一个名为“实践完美”的部分,关于问题10/15,一个字检查。问题是这样的:
编写一个名为censor
的函数,它将两个字符串text
和word
作为输入。它应该返回带有您选择的替换为星号的word
的文本。
我的想法是这样做:
def censor(text, word):
length_of_word = len(word)
word_now_censored = '*' * length_of_word
wordlist = text.split()
for item in wordlist:
if item == word:
item = word_now_censored
return " ".join(wordlist)
但是,似乎在for循环中更改item
的值不会更改列表中项目的值。
我认为另一种方法可能是使用while
循环,从i = 0
转到i < len(wordlist)
,然后根据需要修改wordlist[i]
,但我只是喜欢理解为什么我的for
- 循环方法不起作用。
答案 0 :(得分:6)
将其更改为:
for index, item in enumerate(wordlist):
if item == word:
wordlist[index] = word_now_censored
答案 1 :(得分:4)
您只需使用re.sub
替换word
的所有实例:
import re
def censor(text, word):
return re.sub(r'\b{}\b'.format(word), '*' * len(word), text)
答案 2 :(得分:1)
你的观察是正确的
更改for循环中item的值不会更改列表中项目的值。
有很多方法可以解决这个问题。这是一种方式。创建另一个变量new_words_list
。如果不是wordlist
,请将new_words_list
中的字词附加到word
。否则将word_now_censored
附加到new_words_list
。
转换为:
def censor(text, word):
length_of_word = len(word)
word_now_censored = '*' * length_of_word
wordlist = text.split()
new_words_list = []
for item in wordlist:
if item == word:
new_words_list.append(word_now_censored)
else:
new_words_list.append(item)
return " ".join(new_words_list)
答案 3 :(得分:1)
def censor(text,word):
text=list(text)
for n in range(0,len(text)):
i=0
while 1==1:
for i in range(0,len(word)):
if text[n+i]==word[i]:
i+=1
else:
break
if i==len(word):
for m in range(0,i):
text[n+m]='*'
else:
break
n+=i
return "".join(text)
print censor("this hack is wack hack", "hack")
答案 4 :(得分:0)
这是另一个版本:
def censor(text, word):
lst = text.split()
while word in lst:
index = lst.index(word)
lst.remove(word)
lst.insert(index,'*' * len(word))
return " ".join(lst)
答案 5 :(得分:0)
censor将两个字符串(文本和单词)作为输入。它返回带有您用星号替换的单词的文本。
def censor(text,word):
result = ""
count = 0
no_of_stars = 0
split_list = text.split()
for i in split_list:
count += 1
if(i==word):
result += "*" * len(i)
else:
result +=i
if(count != len(split_list)):
result += " "
return result
答案 6 :(得分:0)
这是我的版本。只需构建一个与单词长度相同的新星号,然后替换它。
def censor(text, word):
if word in text:
blabber = ""
while True:
blabber += "*"
if len(blabber) == len(word):
break
return text.replace(word, blabber)
答案 7 :(得分:0)
def censor(text,word):
res = text.split()
temp = ""
for i,j in enumerate(res):
if j == word:
res[i] = "*" * len(word)
return " ".join(res)
答案 8 :(得分:0)
刚刚解决了,这是我的解决方案:
traj = LOAD 'file:///root/traj'
USING org.apache.pig.piggybank.storage.CSVExcelStorage(
';', 'NO_MULTILINE', 'UNIX', 'SKIP_INPUT_HEADER'
) AS
(
a1:chararray,
a2:long,
a3:long,
a4:float,
a5:float,
a6:float,
a7:chararray,
a8:float,
a9:chararray
);
c = FOREACH (GROUP traj ALL) GENERATE COUNT(traj);
dump c;
答案 9 :(得分:0)
def censor(text,word) :
c=''
for i in text.split() :
if i == word :
i = "*" * len(word)
c += ' ' + i
else :
c += ' ' + i
return c
print censor("this hack is wack hack", "hack")
答案 10 :(得分:0)
def censor(text, word):
lista=[]
for i in text.split():
if i==word:
lista+=['*'*len(word)]
else:
lista+=[i]
return ' '.join(lista)
答案 11 :(得分:0)
def censor(text, word):
new_text = text.split()
ctext = []
for item in new_text:
if item == word:
item = "*" *len(word)
ctext.append(item)
return " ".join(ctext)
答案 12 :(得分:0)
def censor(text, word):
a = word
b = len(a)
for a in text:
text = text.replace(word, "*"*b)
return text
答案 13 :(得分:0)
我的想法只是:
def censor(text, word):
answer = text.replace(word, "*"*len(word))
return answer
这可能很简单,但我认为简单就是好的。而且我没有使用任何循环,这是好事吗? 如果您喜欢我的回答,请告诉我,我会非常高兴。谢谢
答案 14 :(得分:0)
我做得很简单,我不明白为什么没有人提到这一点。
def censor(text, word):
return text.replace(word,"*" * len(word))
答案 15 :(得分:0)
如果您能看一看,我将不胜感激。
def censor(text, word):
if word in text:
return text.replace(word, '*' * len(word))