Frage zu Häufigsten Charakteren

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
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

Hi, ich würde gerne wissen, wie ich den häufigsten Buchstaben eines Inputs in einer variable speichern kann und dann noch damit rechnen kann. Dies ist der Code den ich gerade habe, aber ich kann dann nicht mit ord rechnen. Danke im Vorraus!

Code: Alles auswählen

 def most_frequent(text):
                        return Counter(text).most_common(1)[0][0]
                print(most_frequent(text)) 
                haeufigstes = (most_frequent)
                for c in text:
                        count = 0
                        haeufigstebuchstaben = ["e", "n", "i", "s", "r", "a", "t", "d", "h", "u", "l", "c", "g", "m" "o", "b", "w", "f", "k", "z", "p", "v", "j", "y", "x", "q"]
                        haeufigsterbuchstabegerade = haeufigstebuchstaben[count]
                        print(haeufigsterbuchstabegerade)
                        testloesungsbuchstabe = ord(haeufigstes[0]) - ord(haeufigsterbuchstabegerade[0])
                        print(testloesungsbuchstabe)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum ein neues Thema? Und warum hast du keine der Hinweise im ersten Thema adressiert?
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

__deets__ hat geschrieben: Mittwoch 7. Juli 2021, 14:55 Warum ein neues Thema? Und warum hast du keine der Hinweise im ersten Thema adressiert?
Ich habe jetzt das genaue Problem dank der Hilfe von dem vorherigen Post gefunden, weiß aber immer noch nicht wie man das beheben soll also dachte ich, dass man für so etwas einen neuen Post machen sollte. Ich könnte aber auch falsch liegen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt denn “das Problem gefunden”. Es ist doch noch da. Die ganzen Kommentare zur Einrückung, die falsche Zeile Code. Du hast einfach nur den Counter drüber geballert, und alles andere da stehen lassen.

Und das Thema ist ja immer noch das gleiche. Diese Funktion zum laufen bringen für die Hausaufgabe.
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

__deets__ hat geschrieben: Mittwoch 7. Juli 2021, 15:16 Was heißt denn “das Problem gefunden”. Es ist doch noch da. Die ganzen Kommentare zur Einrückung, die falsche Zeile Code. Du hast einfach nur den Counter drüber geballert, und alles andere da stehen lassen.

Und das Thema ist ja immer noch das gleiche. Diese Funktion zum laufen bringen für die Hausaufgabe.
Ich meine halt das die Funktion glaube ich funktionieren würde wenn ich wüsste, wie ich jetzt mit der Funktion rechnen kann, außer ich lieg da auch falsch.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie kommt es denn zu dieser Meinung? Die Funktion wird so doch noch nicht mal vom Interpreter akzeptiert. Woher hast du dann den Eindruck, sie funktioniert?
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

__deets__ hat geschrieben: Mittwoch 7. Juli 2021, 15:33 Wie kommt es denn zu dieser Meinung? Die Funktion wird so doch noch nicht mal vom Interpreter akzeptiert. Woher hast du dann den Eindruck, sie funktioniert?
Weil es mir immer nur sagt, dass es einen error bei der Zeile mit dem Rechnen gibt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und weil es diesen Fehler gibt denkst du, das alles funktioniert? Ich verstehe diese Logik nicht.

Kann es sein, dass du einfach gar nicht verstehst, was da gerade passiert?
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

__deets__ hat geschrieben: Mittwoch 7. Juli 2021, 15:42 Und weil es diesen Fehler gibt denkst du, das alles funktioniert? Ich verstehe diese Logik nicht.

Kann es sein, dass du einfach gar nicht verstehst, was da gerade passiert?
…Höchstwahrscheinlich
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du wirst eine Schippe darauflegen müssen, wenn du Hilfe bekommen willst.

Was für ein Problem sollst du lösen? Was probierst du? Was gibt es für (vollständige!) Fehlermeldungen?

Und wenn dir Hinweise gegeben werden, dann solltest du die auch probieren umzusetzen. Und nicht einfach ignorieren.

Was eher nicht funktionieren wird ist noch nicht mal ansatzweise laufenden Code zusammenkloppen, und mit kryptischen Fragen garniert abzukippen, in der Hoffnung wir reimen uns das alles zusammen & machen deinen Lehrer mit einer fertigen Antwort glücklich.

Zu guter letzt auch nicht jeden Beitrag davor vollständig zitieren. Der steht da schon.
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

Ok tut mir leid. Ich probiers mal klarer zu formulieren:
Ich probiere Cäesar Verschlüsselung via Häufigkeitsanalyse zu lösen. Wenn ich das Skript aber ausführe gibt es mir folgende Fehlermeldung:

raceback (most recent call last):
File "c:\Users\kaish\Documents\Python\badatest.py", line 59, in <module>
testloesungsbuchstabe = ord(haeufigstes[0]) - ord(haeufigsterbuchstabegerade[0])
TypeError: 'function' object is not subscriptable

Ich habe probiert eine bestimmte position von "haeufigstes" in eine andere Variable zu packen, doch das funktioniert auch nicht.

Danke das du so viel Geduld mit mir hast btw
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kann aber eigentlich nicht sein, denn den Code zumindest den du oben zeigst, quittiert mein Python mit einem SyntaxError. Code und Fehler müssen schon zusammenpassen. Darum am besten immer beides gleichzeitig posten.
Uludug
User
Beiträge: 8
Registriert: Dienstag 6. Juli 2021, 11:15

Das ganze Skript ist länger und kann auch Verschlüsselung und Entschlüsselung mit lösungsbuchstabe. Ich dachte nur der Teil wäre wichtig, sorry. Hier ist das ganze Skript:

Code: Alles auswählen

print("Ich bin da um mit der Cäesar Methode zu verschlüsseln und entschlüsseln ")
mode = int(input("Willst du verschlüsseln (1) oder entschlüsseln (2) "))
if mode == 1:
        print("Okay, dann verschlüsseln wir mal! ")
        verschluesselungsb = input("Nenne den Verschlüsselungsbuchstaben ")
        if len(verschluesselungsb) == 1:
             zahl = ord(verschluesselungsb[0]) - 96
        elif len(verschluesselungsb) == 2:
                zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 )
        elif len(verschluesselungsb) == 3:
                zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 ) + (ord(verschluesselungsb[2]) - 96 )
        text = input("Und der Text zum Verschlüsseln? ")
        print ("Hier ist dein Text:")
        for c in text:
                encodiert1 = ord(c) + zahl
                while encodiert1 > 122:
                        encodiert1 = encodiert1 - 26
                while encodiert1 < 97:
                        encodiert1 = encodiert1 + 26
                encodiert2 = chr(encodiert1)
                print(encodiert2)
if mode == 2:
        print("Okay, dann entschlüsseln wir mal!")
        modedecodierung = input("Kennst du den Verschlüsselungsbuchstaben? (Y/N) ")
        verschluesselungsb = "a"
        zahl = 0 
        if modedecodierung == "Y":
                verschluesselungsb = input("Nenne den Verschlüsselungsbuchstaben. ")
                if len(verschluesselungsb) == 1:
                        zahl = ord(verschluesselungsb[0]) - 96
                elif len(verschluesselungsb) == 2:
                        zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 )
                elif len(verschluesselungsb) == 3:
                        zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 ) + (ord(verschluesselungsb[2]) - 96 )
                text = input("Und der Text zum Entschlüsseln? ")
                print ("Hier ist dein Text:")
                for c in text:
                        encodiert1 = ord(c) - zahl
                        while encodiert1 > 122:
                                encodiert1 = encodiert1 - 26
                        while encodiert1 < 97:
                                encodiert1 = encodiert1 + 26
                encodiert2 = chr(encodiert1)
                print(encodiert2)
        else:
                text = input("Nenne bitte den verschlüsselten Text. ")
                print("Hier sind meine Vorschläge:")
                from collections import Counter

                def most_frequent(text):
                        return Counter(text).most_common(1)[0][0]
                print(most_frequent(text)) 
                haeufigstes = (most_frequent)
                for c in text:
                        count = 0
                        haeufigstebuchstaben = ["e", "n", "i", "s", "r", "a", "t", "d", "h", "u", "l", "c", "g", "m" "o", "b", "w", "f", "k", "z", "p", "v", "j", "y", "x", "q"]
                        haeufigsterbuchstabegerade = haeufigstebuchstaben[count]
                        print(haeufigsterbuchstabegerade)
                        testloesungsbuchstabe = ord(haeufigstes[0]) - ord(haeufigsterbuchstabegerade[0])
                        print(testloesungsbuchstabe)
              
                while testversuch > 122:
                         testversuch = testversuch - 26
                while encodiert1 < 97:
                        encodiert1 = testversuch + 26
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, dann erklaer mir mal, was der Unterschied zwischen

Code: Alles auswählen

def egal():
    return "hallo"

egal()
und (bei gleichem egal)

Code: Alles auswählen

(egal)


ist.
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

Hi Uludug,

zuerst lass mich sagen: Dein Code ist schräg. Ohne ihn getestet zu haben würde ich mal folgendes feststellen:
- eine einfache Cäsar- Chiffre ist eine Verschiebung um eine bestimmte Anzahl von Buchstaben. Du lässt Deinen Nutzer aber einen 3- Stelligen "Codierungsschlüssel" eingeben, aus dem Du dann eine Verschiebungszahl ausrechnest. "aaa" liefert dann das gleiche Ergebnis wie "c", bei "A" kommt eine negative Zahl raus. Überhaupt löst Du das mit dem Übertrag seltsam. Du rechnest quasi irgendeinen nicht mehr im Bereich der Kleinbuchstaben darstellbaren Code aus und verschiebst ihn zurück in die Kleinbuchstaben. Ich will nicht sagen, dass das nicht funktioniert, aber Im Grunde baust Du m.E. gerade eine Hundehütte aus handgehäkelter Naturseide
- Python erhält seine Übersichtlichkeit dadurch, dass es per Zwang einrückt, aber auch dadurch, dass die Funktionen klein und gut gekapselt sind. Mindestens deine drei Modi solltest Du m.E. in getrennte Funktionen auslagern (z.B. codieren, decodieren, erraten) Eigentlich sind bei Cäsar- Chiffre codieren und decodieren gleich, wenn Du das Vorzeichen der Verschiebung umkehrst, aber ich will Dir Deine Implementierung nicht kaputt machen
- Das Ermitteln Deiner Verschiebungszahlen sollte in eine eigene Funktion ausgelagert werden (z.B. berechne_verschiebung(code_text : str) ), da Du sie ja mehrmals genau gleich benutzt. Überlege Dir auch, ob Du das - statt mit einer kaskadierten Verzweigung - auch mit einer Schleife hinbekommen kannst.

Ich habe mich jetzt nicht mit collections.Counter beschäftigt, aber angenommen, es ist so, wie Du erwartest, dass

Code: Alles auswählen

most_frequent(text)
das erwartete Ergebnis liefert, dann passiert in der Zeile

Code: Alles auswählen

haeufigstes = (most_frequent)

nicht mehr, als dass Du der funktion most_frequent auch noch den Namen haeufigstes verpasst. Du könntest also auch

Code: Alles auswählen

haeufigstes(text)
anstelle von

Code: Alles auswählen

most_frequent(text)
aufrufen, mit exakt dem gleichen Ergebnis. Das ist auch das, worauf Dich __deets__ hinweisen wollte.
UNd wenn Du dann später

Code: Alles auswählen

ord(haeufigstes[0])
aufrufst, dann bittest Du python also, das Nullte Element der o.g. Funktion zur Verfügung zu stellen und Python antwortet folgerichtig mit: Nix da, eine Funktion hat so was nicht.

Du könntest jetzt also konkret den Fehler suchen und beheben, Du könntest aber auch überlegen, ob Du Deinen Code zumindest etwas übersichtlicher machen kannst durch Neustrukturierung. Das hätte den Vorteil, dass Du selbst besser durchsiehst, aber auch, dass potentielle Helfer nicht so viel Mühe haben, sich einzuarbeiten. Ob er funktioniert und ob es chic ist, dass er letztlich nur mit Kleinbuchstaben zwischen a und z umgehen kann - das ist eine anderes Thema (heißt nicht: Neuer Thread, sondern einfach nur: anderer Aspekt im gleichen Thread).
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, damit ist das für das geübt Auge viel übersichtlicher:

Code: Alles auswählen

if mode == 1:
    print("Okay, dann verschlüsseln wir mal! ")
    verschluesselungsb = input("Nenne den Verschlüsselungsbuchstaben ")
    if len(verschluesselungsb) == 1:
        zahl = ord(verschluesselungsb[0]) - 96
    elif len(verschluesselungsb) == 2:
        zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 )
    elif len(verschluesselungsb) == 3:
        zahl = (ord(verschluesselungsb[0]) - 96) + (ord(verschluesselungsb[1]) - 96 ) + (ord(verschluesselungsb[2]) - 96 )
    text = input("Und der Text zum Verschlüsseln? ")
    print ("Hier ist dein Text:")
    for c in text:
        encodiert1 = ord(c) + zahl
        while encodiert1 > 122:
            encodiert1 = encodiert1 - 26
        while encodiert1 < 97:
            encodiert1 = encodiert1 + 26
        encodiert2 = chr(encodiert1)
        print(encodiert2)
Mit den magischen Zahlen 96, 122 oder 97 kann niemand etwas anfangen, daher ersetzen wir sie durch lesbare Buchstaben. `zahl`, `encodiert1` und `encodiert2` sind schlechte Variablennamen, weil sie nichts über den Inhalt aussagen. Worin unterscheiden sich die beiden `encodiert`? Für was steht die Zahl? Variablen sollten keine Abkürzungen enthalten, was soll das b bei verschluesselungsb? Und ist das wirklich nur EIN Buchstabe?

Code: Alles auswählen

if mode == 1:
    print("Okay, dann verschlüsseln wir mal! ")
    verschluesselungstext = input("Nenne den Verschlüsselungstext:")
    if len(verschluesselungstext) == 1:
        verschiebung = ord(verschluesselungstext[0]) - ord('a') + 1
    elif len(verschluesselungstext) == 2:
        verschiebung = (ord(verschluesselungstext[0]) - ord('a') + 1) + (ord(verschluesselungstext[1]) - ord('a') + 1)
    elif len(verschluesselungstext) == 3:
        verschiebung = (ord(verschluesselungstext[0]) - ord('a') + 1) + (ord(verschluesselungstext[1]) - ord('a') + 1) + (ord(verschluesselungstext[2]) - ord('a') + 1)
    text = input("Und der Text zum Verschlüsseln? ")
    print("Hier ist dein Text:")
    for zeichen in text:
        verschluesselter_zeichenwert = ord(zeichen) + verschiebung
        while verschluesselter_zeichenwert > ord('z'):
            verschluesselter_zeichenwert -= 26
        while verschluesselter_zeichenwert < ord('a'):
            verschluesselter_zeichenwert += 26
        verschluesseltes_zeichen = chr(verschluesselter_zeichenwert)
        print(verschluesseltes_zeichen)
Was passiert, wenn der Verschlüsselungstext mehr als 3 Buchstaben hat?

Code-Wiederholungen kann man durch Schleifen ersetzen. Und die while-Schleifen durch eine einfache mathematische Operation:

Code: Alles auswählen

if mode == 1:
    print("Okay, dann verschlüsseln wir mal! ")
    verschluesselungstext = input("Nenne den Verschlüsselungsbuchstaben ")
    verschiebung = 0
    for zeichen in verschluesselungstext:
        verschiebung += ord(zeichen) - ord('a') + 1

    text = input("Und der Text zum Verschlüsseln? ")
    print("Hier ist dein Text:")
    for zeichen in text:
        verschluesselter_zeichenwert = (ord(zeichen) - ord('a') + verschiebung) % 26  + ord('a')
        print(chr(verschluesselter_zeichenwert))
Um den Code lesbarer zu machen, sollten die einzelnen Teile in Funktionen ausgelagert werden:

Code: Alles auswählen

def generiere_verschiebung(verschluesselungstext):
    verschiebung = 0
    for zeichen in verschluesselungstext:
        verschiebung += ord(zeichen) - ord('a') + 1
    return verschiebung

def verschluessle(text, verschiebung):
    return ''.join(
        chr((ord(zeichen) - ord('a') + verschiebung) % 26  + ord('a'))
        for zeichen in text
    )

if mode == 1:
    print("Okay, dann verschlüsseln wir mal! ")
    verschluesselungstext = input("Nenne den Verschlüsselungsbuchstaben ")
    text = input("Und der Text zum Verschlüsseln? ")

    verschiebung = generiere_verschiebung(verschluesselungstext)
    verschluesselter_text = verschluessle(text, verschiebung)
    print("Hier ist dein Text:", verschluesselter_text)
Ähnliche Anpassungen kannst Du für den Rest des Codes selbst ausprobieren.
Antworten