Textersetzung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pleasehelp!
User
Beiträge: 28
Registriert: Donnerstag 15. November 2018, 20:44

Hallo,
ich habe ein Programm geschrieben zur Dechiffrierung eines Programmes, ich bin neu auf dem Gebiet und entschuldige umständliche Lösungen, aber anders ist es oft schwierig für mich. Also das Problem liegt momentan darin, dass ich bei der Funktion ersetzeneu die Liste ersetzen verändern möchte, allerdings bekomme ich immer den Text der vorherigen dechiffrierung ausgegeben.
Bei Vereinfachungsmöglichkeiten oder Lösungsansätzen kleinster Art bin ich für jede Antwort dankbar.

Code: Alles auswählen

##Informationen für das Programm
from operator import itemgetter
import string
import time

anzahl = dict.fromkeys(string.ascii_uppercase + 'ßÄÖÜ', 0) #alphabet erstellen in dict
ersetzungh = ["e", "n", "d", "i", "a", "s", "r", "h", "t", "u", "l", "c", "g", "m", "o", "b", "w", "f", "k","z", "v", "p", "ü", "ä", "ß", "ö", "j", "y", "x", "q"]

#Definitionen
def liste(daten,index):
    neu = []
    x = 0
    while x < len(daten):
        neu.append(daten[x][index])
        x += 1
    print (neu)
    return neu
    
def übersetzen(datei):
    for buchstabe in datei:
        a = 0
        for buchstaberi in neu:
            if buchstabe == buchstaberi:
                datei = datei.replace(buchstabe, ersetzungh[a])
                break
            a += 1
    print(datei)
    return datei
    
def ersetzenneu():
    global text
    global ersetzen
    eingabebeendet = 0
    while eingabebeendet == 0:
        prüfung1 = []
        prüfung2 = []
        pbeendet = 0
        while pbeendet == 0:
            s = input("chiffrat: ").upper()
            z = input("neues dechiffrat: ").lower()
            prüfung1.append(s)
            prüfung2.append(z)
            i = 0
            while i < len(ersetzen):
                if s == ersetzen[i][0]:
                    ersetzen[i][1] = z
                    break
                i += 1 
            y = len(prüfung2) - 1
            if prüfung1[0] != prüfung2[y].upper():
                print("Jetzt bitte", z, "ersetzen!")
                pbeendet = 0
            elif prüfung1[0] == prüfung2[y].upper():
                pbeendet = 1
        print (ersetzen)
        suche = liste(ersetzen, 0)
        neuneu = liste(ersetzen, 1)
        print(suche, neuneu)
        abfragebeendet = 0
        while abfragebeendet == 0:
            Eingabe = input("Ist die Übersetzungstabelle so richtig? Ja oder Nein? ")
            Eingabe = Eingabe.upper()
            print ("\n")
            if Eingabe == "NEIN":
                eingabebeendet = 0
                abfragebeendet = 1
            elif Eingabe == "JA":
                print("Ihr Text wird nun neu übersetzt.", "\n")
                time.sleep(0.5)
                for buchstabe in text:
                    a = 0
                    for buchstaberi in suche:
                        if buchstabe == buchstaberi:
                            text = text.replace(buchstabe, neuneu[a])
                            break
                        a += 1
                print(text)
                eingabebeendet = 1
                abfragebeendet = 1
            else: 
                print ("\n", "Ihre Eingabe ist leider ungültig. Deshalb erneut die Frage:")
                abfragbeendet = 0
    print(ersetzen)
    return text, ersetzen, neuneu
    
##Informationseingabe des Benutzers
print("Herzlich Willkommen bei ihrem Entschlüsselungsprogramm.", "\n", "Bitte geben sie bei der folgenden Texteingabe ihren Dateinamen ein.")
x = input("Texteingabe: ")
text = open(x).read()

print(text)

##Formatieren und zählen
for character in text.upper():
    if character in anzahl:
        anzahl[character] += 1
daten = list(sorted(anzahl.items(), key=itemgetter(1), reverse=True)) #liste mit unterliste erstellen; sortiert nach der zahl; abfallend
print(daten)

    
##Ersetzung

#Ersetzungstabelle erstellen
neu = liste(daten, 0)
text = text.upper()

ersetzen = []
b = 0
for wert in neu:
    ersetzen.append([wert, ersetzungh[b]])
    b += 1
print(ersetzen)

#ersetzen
übersetzen(text)

#Prüfung auf Richtigkeit
abfragebeendet = 0
while abfragebeendet == 0:
    Eingabe = input("Möchtest du etwas an der Übersetzung ändern? Ja oder Nein?")
    Eingabe = Eingabe.upper()
    print ("\n")
    if Eingabe == "NEIN":
        print("Ihr dechiffrierter Text: ", "\n", text)
        abfragebeendet = 1
    elif Eingabe == "JA":
        ersetzenneu()
        print(text)
        abfragebeendet = 1
    else: 
        print ("\n", "Ihre Eingabe ist leider ungültig. Ja oder nein:")
        abfragbeendet = 0
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kennst for-Schleifen, benutzt aber in `liste` eine while-Schleife, die deutlich komplizierter ist. Mit Listcompression läßt sich das noch kompakter schreiben:

Code: Alles auswählen

def liste(daten, index):
    return [r[index] for r in daten]
In `übersetzen` ist die doppelte for-Schleife sehr langsam, ein Wörterbuch würde das Übersetzen stark beschleunigen. `datei` ist der falsche Variablennamen, `daten` wären besser, oder einfach nur `text`. `neu` kommt aus dem Nichts, das sollte als Argument übergeben werden.

Code: Alles auswählen

def übersetzen(neu, text):
    ersetzung = dict(zip(neu, ersetzungh))
    return ''.join(ersetzung.get(buchstabe, buchstabe) for buchstabe in text)
translate das ganze zu einem Einzeiler:

Code: Alles auswählen

def übersetzen(neu, text):
    return text.translate(dict(zip(map(ord, neu), ersetzungh)))
Vergiss dass es global gibt. In `ersetzenneu` sollten `text` und `ersetzen` Argumente sein.
Statt `0` und `1` für die Flags `eingabebeendet`, `pbeendet` und `abfragebeendet` zu verwenden, solltest Du False und True verwenden. Statt der Flags `eingabebeendet`, `pbeendet` und `abfragebeendet` solltst Du while-True-Schleifen verwenden, die Du per `break` verläßt. Die Funktion ist zu lang und sollte in mehrere Funktionen aufgeteilt werden. `ersetzen` sollte ein Wörterbuch sein.

Alles ab `##Informationseingabe des Benutzers` sollte auch in einer Funktion stehen, so dass man erst gar nicht in Verlegenheit kommt, globale Variablen zu benutzen.
Antworten