Kod ASCII - zaszyfrowanie słowa

Kod ASCII - zaszyfrowanie słowa
H9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Chodzi o to, że if używa kodu ASCII do tego, żeby litery pomięzy A, a - Z, żeby zamienić litery na myślniki. Mógłby ktoś powiedzieć jak to poprawić, żeby nie wyrzucało błędu ?

stivens
  • Rejestracja: dni
  • Ostatnio: dni
0

W pythonie stringi sa immutable, wiec nie mozesz podmienic literki pod danym indeksem, ale mozesz zbudowac nowego stringa

Tylko co wlasciwie chciales osiagnac w tej petli?

maciekniewielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 36
1

Po pierwsze, piszesz w Pythonie, a kod wygląda jak z C. Zamiast for i in range(0, len(tekst)): znacznie wygodniej jest pisać for char in tekst:. W takim wypadku masz od razu dostęp do każdego znaku.

Po drugie, masz coś nie tak z warunkiem. Brakuje znaków nierówności dla małych liter oraz zakresy są przesunięte o 1 w złą stronę. Dodatkowo, jeśli to nie jest wymóg, prościej (i przejrzyściej) jest sprawdzić, czy litera jest w string.ascii_letters (trzeba zaimportować moduł string). Dzięki temu warunek będzie wyglądał tak if tekst[i] in string.ascii_letters: w Twojej wersji lub tak if letter in string.ascii_letters: w mojej.

Po trzecie, jak już @stivens wspomniał, stringi są immutable, więc przydałoby się zbudować nowego. Można przykładowo stworzyć pustą listę przed pętlą, a następnie dodawać do niej litery. Po wszystkim łączysz listę za pomocą "".join(lista) i masz gotowego nowego stringa. Teoretycznie da się zamiast listy stworzyć pustego stringa i dodawać do niego po kolei litery, ale jest to mało wydajne, ponieważ z każdym dodawaniem jest tworzony nowy obiekt string.

Tak więc trochę bardziej Pythonowy kod wyglądałby tak:

Kopiuj
temp = []
for char in tekst:
    if (65 <= ord(char) <= 90) or (97 <= ord(char) <= 122): # Lub char in string.ascii_letters
        temp.append('-')
    else:
        temp.append(char)
tekst = "".join(temp)

A jeszcze bardziej

Kopiuj
import string
tekst = "".join(['-' if char in string.ascii_letters else char for char in tekst])
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
1

Jeszcze można bez pętli, z użyciem re.sub() i wyrażenia regularnego.

enedil
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1028
1

@maciekniewielki:
jeszcze lepsza wersja warunku:

Kopiuj
if 'A' <= char <= 'Z' or 'a' <= char <= 'z':
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
0

@enedil

Kopiuj
if 'a' <= char.lower() <= 'z':
vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
Guaz
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Częstochowa
  • Postów: 221
0

Jest jeszcze jedna metoda:

Kopiuj
#Przykład
>>> "".join(lett for lett in "abccde23432" if lett.isdigit())
'23432'

#Użycie warunku lewostronnie jeśli nie chcesz pomijać elementów.
>>> text = input("Wpisz coś: ")
Wpisz coś: A tutaj podajemy twój tekst do 'wymyślnikowania'.
>>> "".join('-' if 'a' <= char.lower() <= 'z' else char for char in text)
"- ----- -------- --ó- ----- -- '----ś----------'."

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.