2017-01-09 13 views
9

Robię Pythona na Codecademy próbując ocenzurować słowo w tekście. Kod działa, ale jeśli ostatnie słowo w tekście ma słowo, nie zostanie ono ocenzurowane.Python: Cenzorowanie słowa w tekście, ale ostatnie słowo nie cenzoruje

Uważam, że instrukcja for wymaga zmian, takich jak for x in (text + 1), ale oczywiście powoduje błąd. Nie mamy korzystać z wbudowanych funkcji, takich jak replace() Jakieś pomysły?

def censor(text,word): 
    text = text.split() 
    for x in text: 
     if x == word: 
      text[text.index(x)] = "*" * len(word) 
    return " ".join(text) 

print(censor("You dirty guy and dirty boy dirty.", "dirty")) 

ta zwraca [You ***** guy and ***** boy dirty.]

+5

Proponuję użyć 'ul. replace' or 're.sub' – Dmitry

+2

Zgadzam się wydaje się dziwne, że nie możesz użyć polecenia replace, ale możesz użyć polecenia split, index, len, join i print. Wszystkie są wbudowane – crowie

+1

Możesz zmienić swój test, aby usunąć interpunkcję: 'if x.translate (None, string.punctuation) == word:' – samgak

Odpowiedz

17

To prawdopodobnie w tym kropkę w ostatnim tokenu, więc jest porównanie "dirty." z "dirty".

+6

Czy celowo unikasz proponowania rozwiązania (ponieważ pytanie dotyczy kontekstu Code Academy)? – Darthfett

+0

Tak, uważam, że łatwiej się jej nauczyć, gdy ludzie kierują mnie do odpowiedzi, ale nie w pełni odpowiadają na nią. –

14

Ostatnim wystąpieniem zabrudzenia jest 'dirty.' zamiast 'dirty'. To może być łatwiejsze w użyciu funkcji replace:

def censor(text,word): 
    return text.replace(word, len(word)*'*') 

Bez wbudowanych funkcji:

def censor(text,word): 
    while 1: 
     wordPosition = text.find(word) 
     if wordPosition < 0: 
      break 
     text = text[:wordPosition] + len(word)*'*' + text[wordPosition+len(word):] 
    return text 
+2

Powiedział: "Nie powinniśmy używać wbudowanych funkcji, takich jak replace()". –

+0

Jak to się dzieje w przypadku, gdy słowo do cenzury może być częścią większego słowa? Na przykład, czy "tyłek" zostaje ocenzurowany tylko wtedy, gdy pojawia się jako słowo, czy też jest cenzurowany w "zabójcy"? – Darthfett

+2

Tak, na razie będzie cenzurować "zabójcę" - powinieneś zaimplementować funkcję wyszukiwania w celu wyszukania prawdziwych słów ... –

1

To ze względu na ostatni brudny mający . tak więc, nie ma różnicy między brudne i brudne (.). Oto sposób na rozwiązanie problemu:

def censor(text, word): 
    wordlist = text.split() 
    new_words_list = [] 
    for item in wordlist: 
     if item.find(word) > -1: 
      new_words_list.append('*' * len(word)) 
     else: 
      new_words_list.append(item) 
    return " ".join(new_words_list) 

print(censor("You dirty guy and dirty boy dirty.", "dirty")) 

wyjściowa:

You ***** guy and ***** boy ***** 
+3

Czy celowo unikasz proponowania rozwiązania (skoro pytanie jest w kontekście Code Academy)? – Darthfett

+0

@Darthfett Yeah.Ale dodałem kod teraz, aby rozwiązać problem.Someone/OP może się przydać. – Inconnu

6

Christopher jest prawdą, że to porównanie dirty do dirty. z kropką. Jak pan powiedział, że nie można używać replace funkcji, więc można zmienić swoje oświadczenie if być

if x.startswith(word) == True: 
+4

Jeśli rozszerzysz to na filtr wulgaryzmów, to mieszkańcy [Crapstone] (https://en.wikipedia.org/wiki/Crapstone) prawdopodobnie nie doceniliby tego podejścia. – JonK

+0

Po prostu 'if x.startswith (word):' proszę, nie ma potrzeby wyraźnych porównań do 'True' lub' False' w instrukcji Python if. – zwol

1

Można użyć re.sub zastąpić pracę z tekstem

import re 
re.sub("word", "new_replaced_word", text) 
Powiązane problemy