Seite 1 von 1

Code funktioniert nicht

Verfasst: Montag 30. Dezember 2019, 00:44
von Fadost
Guten Abend.


Ich bin neu hier im Forum. Habe schon öfters mal als Gast einige Beiträge verfolgt und auch einiges lernen können.

Nun habe ich selbst ein kleines Problem und hoffe auf ein paar gute Ratschläge.

Zu aller erst sei noch zu sagen, das ich weder Informatik studiere, noch Schüler bin und auch keine Pflicht Hausaufgaben mehr machen muss.

Ich benötige trotzdem Hilfe bei einer Aufgabe, die ich lösen möchte und bei der ich einfach nicht weiter komme... ich gebe euch einfach mal die Aufgabenstellung und meine Lösung mit an:

————————————————————————————-
You are trying to send a secret message, and you've decided to encode it by replacing every letter in your message with its corresponding letter in a backwards version of the alphabet.
What do your messages look like?

Task:
Create a program that replaces each letter in a message with its corresponding letter in a backwards version of the English alphabet.

Input Format:
A string of your message in its normal form.

Output Format:
A string of your message once you have encoded it (all lower case).

Sample Input:
Hello World

Sample Output:
svool dliow
—————————————————————————————

Meine nicht funktionierende Lösung:


import string

a = string.ascii_lowercase
z = a[::-1]
string = str(input()).lower()

for i in string:
x = a.find(i)
string = string.replace(a[x], z[x])

print(string)

—————————————————————————————

Wenn ich als Beispiel String: Vegetable Pizza eingebe, erhalte ich den String: vvgvgzyov krzzz heraus...
Es sollte aber evtvgzyov kraaz ausgegeben werden.

Re: Code funktioniert nicht

Verfasst: Montag 30. Dezember 2019, 11:05
von sparrow
Hallo und willkommen im Forum.

Code solltest du hier immer in Code-Tags setzen. In diesem Fall weniger wichtig, aber nur so bleuben später die Einrückungen erhalten, die bei Python wichtig sind. Code Tags werden automatisch erstelltn wenn du den </> Button in "Vollständiger Editor & Vorschau" klickst.

Zum Code: Benutze Aussagekräftige Namen für Variablen. "a" sollte "lower_cases" heißen, "z" reverse_alphabet.
Du impoertierst erst "string" und bindest dann im Code etwas Anderes an den Namen, nämlich die Eingabe. Das verwirrt den Leser, auch wenn es hier nicht zu einem Fehler führt.


Du änderst den String, über den du iteriert. Das sollte man niemals tun.
Bei dem Vorgehen, das du verwendest, werden auch die Buchstaben geändert, die bereits geändert wurden.
Angenmmen deine Zeihenkette wäre "aazz" würde folgendes passieren:

Schritt 1:
1. Buchstabe ist "a" -> alle "a" auf "z" ändern. Ergebnis: "zzzz"
Schritt 2:
2. Buchstabe ist "z"...-> alla "z" auf "a" ändern. Ergebnis: "aaaa"
...
hups

Änder nicht die bereits vorhandene Zeichenkette sondern gehe die Buchstaben für Buchstaben durch, erkenne das "Gegenteil" und füge es an eine neue Zeichenkette an.
Im optimalsten Fall benutzt du eine Liste und machst daraus mit "".join() hinterher eine Zeichenkette.

Re: Code funktioniert nicht

Verfasst: Montag 30. Dezember 2019, 14:15
von Fadost
Hallo sparrow.


Vielen Dank für deine ausführliche Antwort !

Das hat mir schon sehr weiter geholfen, darauf wäre ich so schnell wohl nicht mehr gekommen.

Auch danke ich dir, das du mich auf meinen Code Stil hinweißt.
Da hast du natürlich vollkommen Recht, so ist der Code unübersichtlich. Ich habe das ganze gestern Nacht geschrieben und aus Wut/Verzweiflung dann nicht mehr auf die Details geachtet und dabei ist dann dieser schlampige Code heraus gekommen.

Re: Code funktioniert nicht

Verfasst: Montag 30. Dezember 2019, 14:56
von sparrow
Du kannst auch gerne deine Lösung zeigen. Wir schauen da gerne drüber und gucken, ob er vielleicht noch verbesert werden kann.

Re: Code funktioniert nicht

Verfasst: Montag 30. Dezember 2019, 19:44
von __blackjack__
Die `translate()`-Methode ist hier ganz praktisch:

Code: Alles auswählen

#!/usr/bin/env python3
from string import ascii_lowercase as ALPHABET

ENCODING_TABLE = str.maketrans(ALPHABET, ALPHABET[::-1])


def main():
    print(input().lower().translate(ENCODING_TABLE))


if __name__ == "__main__":
    main()

Re: Code funktioniert nicht

Verfasst: Dienstag 31. Dezember 2019, 16:05
von Fadost
Habe das ganze nun wie folgt gelöst:

Code: Alles auswählen


import string


alphabet = string.ascii_lowercase

alphabet_reverse = alphabet[::-1]

stringinp = str(input()).lower()

list = []

newstringlst = []


for i in stringinp:
  x = alphabet.find(i)
  if i == " ":
    list.append(99)
  else:
    list.append(x)
  
  
for i in list:
  if i == 99:
    newstringlst.append(" ")
  else:
    newstringlst.append(alphabet_reverse[i])




finalstring = "".join(newstringlst)

print(finalstring)


Ich wünsche euch allen einen guten Rutsch ins neue Jahr !

Re: Code funktioniert nicht

Verfasst: Dienstag 31. Dezember 2019, 16:33
von Sirius3
Gute Variablennamen helfen beim Verstehen ungemein. Unter `i` oder `x` kann sich niemand was vorstellen, character oder character_index sind da viel sprechender. `list` ist zu generisch und außerdem schon vom list-Datentyp belegt. Benutze keine Abkürzungen, oder wurde das i von lst schon für das i der for-Schleife gebraucht?
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Variablen sollte man erst dann initialisieren, wenn sie gebraucht werden, `newstringlst` wird dafür 10 Zeilen zu früh eingeführt.
Was sehr verwirrend ist, ist, dass das x der ersten for-Schleife zum i der zweiten wird, obwohl die beiden `i` zwei völlig verscheidene Dinge bezeichnen. Magische Zahlen sollten in einem Programm nicht vorkommen. 99? Warum nicht 42?
Die beiden Schleifen sind auch gar nicht nötig, weil der Zwischenzustand, alle Zeichen in ihre Indizes zu konvertieren gar nicht dauerhaft gebraucht wird. In einer Schleife spart man sich quasi den halben Code.
Dann sollte man seinen Code gründlich testen. Warum tauchen plötzlich so viele `a`s auf, wenn man einen String mit Punkt und Komma eingibt?