Codecademy Practice完美10/15(单词审查)

时间:2014-05-23 15:14:50

标签: python

我在Codecademy,一个名为“实践完美”的部分,关于问题10/15,一个字检查。问题是这样的:

编写一个名为censor的函数,它将两个字符串textword作为输入。它应该返回带有您选择的替换为星号的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 - 循环方法不起作用。

16 个答案:

答案 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))