/ / Zastępowanie ciągu w liście niepustych ciągów - python, list

Zastępowanie ciągu w liście niepustych ciągów - python, list

Próba napisania kodu zastępującego / cenzorującego słowo w zdaniu / ciągu znaków. Kiedy uruchomię to rzuca

Traceback (ostatnie ostatnie połączenie): Plik "python", wiersz 21, w Plik "python", wiersz 10, w cenzurze TypeError: wyświetla indeksy musi być liczbą całkowitą, a nie str

Oto mój kod:

def censor(text, word):
censored = text.split()
censoredword ="*"*len(word)
for n in censored:
if n == word:
censored[n] = censoredword

print " ".join(censored)

censor("hey baby hey", "baby")

Moje oczekiwane wyniki to hey **** hey

Przetestowałem i wydrukowałem zastępując sekcje podzielonego ciągu za pomocą censored[1]= "string", wydruk wyjściowy censoredword dla różnych word wejścia, i jestem pewien, że iterowałem nadpomyślnie powtarza się w podobny sposób, chociaż nie przy zastępowaniu elementów listy. Nie próbuję zmieniać niezmiennych ciągów na liście, wystarczy zamienić ciąg w indeksie listy na inny. To powiedziawszy, sprawdzając to:

listbegin =["hey", "baby", "hey"]
print " ".join(listbegin)
listbegin[1] = "*"*len(listbegin[1])
print " ".join(listbegin)

zwraca:

hey baby hey
hey **** hey

Ćwiczenie, które próbuję wykonać (samokształcenie, a nie praca domowa) zakłada, że ​​nie wiesz o wiele więcej niż to, czego użyłem - Jestem świadomy, że mogę go użyć .append, .replace, index, enumerate itp., ale chciałbym wiedzieć, dlaczego ten kod rzuca błąd, ponieważ wydaje się, że funkcja części komponentowych działa dobrze.

Co jest oczywiste, czego mi tutaj brakuje?

Odpowiedzi:

0 dla odpowiedzi № 1

Nonlinearfruit jest poprawny. Twój for...in odnosi się do pozycji na liście, a nie do ich indeksu / pozycji, więc jeśli zamierzasz zastąpić swoje oświadczenie censored[n] odnosi się do censored[Hej] orocenzurowane [baby] zamiast pozycji tych ciągów na liście, i jako taki rzuca błąd (ponieważ hey i baby są ciągami, a nie liczbami całkowitymi wskazującymi ich pozycję na liście).

Możesz także skondensować kod za pomocą linii:

def censor(text, word):
censored = text.split()
for n in range(len(censored)): <== use `range()`
if censored[n] == word:
censored[n] = "*"*len(word) <==
print " ".join(censored)

2 dla odpowiedzi nr 2

ZA for x in y pętla to dla każdego pętla. x przyjmie wartość każdego elementu w y. W tym przypadku x będzie ciągiem, a nie indeksem. Jeśli potrzebujesz indeksu, musisz powtórzyć liczbę całkowitą 0 do len(censored):

for i in range(len(censored)):
if censored[i] == word:
censored[i] = censoredWord

0 dla odpowiedzi № 3

W twoim kodzie n jest elementem listy censored. Więc, n jest ciągiem. Nie możesz tego użyć n jako indeks. Do indeksowania dozwolone są tylko liczby całkowite.

Możesz wykonać następujące czynności, jeśli chcesz uniknąć zbyt złożonego podejścia (unikaj wyliczania i tego wszystkiego) -

i = 0
for n in censored:
if n == word:
censored[i] = censoredword
i += 1

W ten sposób możesz śledzić indeks