Seite 1 von 1
Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 14:51
von Uludug
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)
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 14:55
von __deets__
Warum ein neues Thema? Und warum hast du keine der Hinweise im ersten Thema adressiert?
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:04
von Uludug
__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
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:16
von __deets__
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.
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:27
von Uludug
__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.
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:33
von __deets__
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?
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:36
von Uludug
__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.
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:42
von __deets__
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?
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:46
von Uludug
__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
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 15:51
von __deets__
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.
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 16:00
von Uludug
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
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 16:03
von __deets__
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.
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 16:06
von Uludug
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
Re: Frage zu Häufigsten Charakteren
Verfasst: Mittwoch 7. Juli 2021, 19:04
von __deets__
Ok, dann erklaer mir mal, was der Unterschied zwischen
und (bei gleichem egal)
ist.
Re: Frage zu Häufigsten Charakteren
Verfasst: Donnerstag 8. Juli 2021, 08:40
von NoPy
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
das erwartete Ergebnis liefert, dann passiert in der Zeile
nicht mehr, als dass Du der funktion most_frequent auch noch den Namen haeufigstes verpasst. Du könntest also auch
anstelle von
aufrufen, mit exakt dem gleichen Ergebnis. Das ist auch das, worauf Dich __deets__ hinweisen wollte.
UNd wenn Du dann später
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).
Re: Frage zu Häufigsten Charakteren
Verfasst: Donnerstag 8. Juli 2021, 09:03
von Sirius3
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.