Python ASCII-Encoder

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
Jan163
User
Beiträge: 11
Registriert: Donnerstag 23. April 2020, 09:58

Hallo zusammen,
erstmal vorab ist mir bewusst, dass dieses Forum nicht dazu gedacht ist, dass hier jemand einen die Hausaufgaben macht. Deswegen bitte ich hier in diesem Post nicht um eine Lösung, sondern nur um einen Ratschlag.

Ich habe folgenden Auftrag bekommen:
Erstellen Sie ein Programm in Python, das einen gegebenen Text mit Hilfe des ASCII-Codes in eine Zahlenfolge umwandelt. Dabei soll ein Buchstabe stets in drei Ziffern umgewandelt werden.

Beispiel: Aus dem Text: Hallo, wie geht es Dir?
wird die Ziffernfolge: 072097108108111044032119105101032103101104116032101115032068105114063

Konkret besitzt das H den ASCII-Code 72, das a den ASCII-Code 97 usw.. Beachten Sie die führende Null. Wieso ist eine solche sinnvoll?

Diesen Auftrag habe ich gerade so noch hinbekommen, hier mein Code dazu!

print("Geben Sie eine Zeichenkette an")
a = input()

#******************************************
Liste = list(a)
Liste1 = []
Liste2 =[]
#*******************************************

i=0
while i < len(Liste):
Liste1.append(ord(Liste))
i=i+1

for x in Liste1:
Liste2.append('%03d' % x)

print(Liste2)

Zeichenkette = ""
for i in range(0, len(Liste2)):
Zeichenkette = Zeichenkette + Liste2
print(Zeichenkette)
#***************************************************

Als zweiten Auftrag muss ich folgendes machen:
1. Erstellen Sie das zum vorigen Programm passende Programm, das zu einer eingegebenen Zahlen-folge mit Hilfe des ASCII-Codes den zugehörigen Text ausgibt.

Beispiel: Aus der Ziffernfolge: 077105114032102101104108116032100101114032073110102111114109097116105107117110116101114114105099104116046
wird der Text: Mir fehlt der Informatikunterricht.

Leider habe ich keine Ahnung wie das ganze jetzt gehen soll.
1. Ich weis nicht wie ich diese führende Nullen wieder wegbekomme, damit ich mithilfe von chr() einfach den Code entschlüsseln kann
2. Ich weis nicht wie ich diese Ziffernfolge in 3er Abschnitte wieder aufteilen kann.

Deswegen bitte ich hier nun um Ratschlag und evtl. um Ansätze.

Liebe Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jan163: Grundlagen Zeichenketten (beziehungsweise Sequenzen allgemein): „slicing“:

Code: Alles auswählen

In [80]: text                                                                   
Out[80]: '077105114032102101104108116032100101114032073110102111114109097116105107117110116101114114105099104116046'

In [81]: text[10:15]                                                            
Out[81]: '32102'

In [82]: text[0:2]                                                              
Out[82]: '07'

In [83]: text[4:6]                                                              
Out[83]: '05'
Die führenden 0en "verschwinden" automatisch wenn man eine Zeichenkette mit Ziffern in eine Zahl umwandeln.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Anmerkungen zum ersten Programm:

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Namen sollten weder Grunddatentypen enthalten, noch kryptisch abgekürzt werden, noch nummeriert sein. Ein Name soll dem Leser vermitteln was der Wert dahinter bedeutet. `a` tut das so überhaupt nicht. Und generische nummerierte Namen auch nicht. `Liste` wäre beispielsweise besser `zeichen`, `Liste1` wäre besser `unicode_codepoints`, und so weiter. Letztlich sind die ganzen Zwischenlisten aber auch unnötig. Man muss nicht jedes Zwischenergebnis an einen Namen binden oder gar in eine eigene Liste stecken.

Die ``while``-Schleifen sollten ``for``-Schleifen sein. Und zwar *direkt* über die Elemente der Zeichenkette/Liste/Sequenz, ohne den Umweg über eine Laufvariable die als Index verwendet wird.

Das wiederholte ”addieren” von Zeichenketten in einer Schleife ist ineffizient. Idiomatisches Python sammelt die Teilzeichenketten in einer Liste und setzt die hinterher mit der `join()`-Methode auf Zeichenketten zusammen. Oft kann man sich die Liste sparen und einen Generatorausdruck oder einen anderen Iterator an `join()` übergeben.

Ich würde noch einen Test einbauen ob tatsächlich alle Zeichen im ASCII-Bereich (0 bis 127) liegen, denn spätestens bei Zeichen mit einem Codepoint ≥1000 wird das dekodieren sonst nicht mehr funktionieren. Siehe auch die Frage nach dem Sinn der führenden 0(en).

Ich würde in neuem Code nicht mehr ``%`` zur Zeichenkettenformatierung verwenden. Es gibt die `format()`-Methode (und eine gleichnamige Funktion) und ab Python 3.6 f-Zeichenkettenliterale dafür.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Fasst man die vielen Schleifen in eine zusammen, also umwandeln in Zahl, umwandeln in String und zusammenfassen in eine Zeichenkette, zusammen, bleibt das:

Code: Alles auswählen

characters = input("Geben Sie eine Zeichenkette an:")

numbers = []
for character in characters:
    numbers.append('%03d' % ord(character))

numbers = "".join(numbers)
print(numbers)
Da Du nur ASCII-Zeichen übersetzen willst, kannst Du den String in einen ASCII-codierten Bytes-String unwandeln.
Dann iteriert die for-Schleife direkt über Zahlen:

Code: Alles auswählen

characters = input("Geben Sie eine Zeichenkette an:")
numbers = "".join(f"{c:03d}" for c in characters.encode('ASCII'))
Jan163
User
Beiträge: 11
Registriert: Donnerstag 23. April 2020, 09:58

@Sirius3
Erstmal Vielen Dank für die Antwort und für die zwei Lösungsvorschläge.

Jedoch behalte ich selbst meine Lösung für die Aufgabe 1 bei, da ich ehrlich gesagt nur Bahnhof verstehe von deinen beiden Codes.
Wir haben im Informatikunterricht bisher kaum Befehle durchgenommen, sondern nur mit umständlichen Schleifen und Listen gearbeitet. Deswegen ist mein Programm auch so lang und mit so vielen Listen.

Meine Hauptfrage bezieht sich ja aber auf die Aufgabe Nummer 2:
Als zweiten Auftrag muss ich folgendes machen:
1. Erstellen Sie das zum vorigen Programm passende Programm, das zu einer eingegebenen Zahlen-folge mit Hilfe des ASCII-Codes den zugehörigen Text ausgibt.

Beispiel: Aus der Ziffernfolge: 077105114032102101104108116032100101114032073110102111114109097116105107117110116101114114105099104116046
wird der Text: Mir fehlt der Informatikunterricht.

Ich muss also nun einen ASCII-Code zu einem Text umwandeln.

Leider habe ich keine Ahnung wie das ganze jetzt gehen soll.
1. Ich weis nicht wie ich diese führende Nullen wieder wegbekomme, damit ich mithilfe von chr() einfach den Code entschlüsseln kann
2. Ich weis nicht wie ich diese Ziffernfolge in 3er Abschnitte wieder aufteilen kann.

Deswegen bitte ich hier nun um Ratschlag und evtl. um Ansätze.

Liebe Grüße
Jan163
User
Beiträge: 11
Registriert: Donnerstag 23. April 2020, 09:58

__blackjack__ hat geschrieben: Donnerstag 23. April 2020, 12:49 Anmerkungen zum ersten Programm:

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Namen sollten weder Grunddatentypen enthalten, noch kryptisch abgekürzt werden, noch nummeriert sein. Ein Name soll dem Leser vermitteln was der Wert dahinter bedeutet. `a` tut das so überhaupt nicht. Und generische nummerierte Namen auch nicht. `Liste` wäre beispielsweise besser `zeichen`, `Liste1` wäre besser `unicode_codepoints`, und so weiter. Letztlich sind die ganzen Zwischenlisten aber auch unnötig. Man muss nicht jedes Zwischenergebnis an einen Namen binden oder gar in eine eigene Liste stecken.

Die ``while``-Schleifen sollten ``for``-Schleifen sein. Und zwar *direkt* über die Elemente der Zeichenkette/Liste/Sequenz, ohne den Umweg über eine Laufvariable die als Index verwendet wird.

Das wiederholte ”addieren” von Zeichenketten in einer Schleife ist ineffizient. Idiomatisches Python sammelt die Teilzeichenketten in einer Liste und setzt die hinterher mit der `join()`-Methode auf Zeichenketten zusammen. Oft kann man sich die Liste sparen und einen Generatorausdruck oder einen anderen Iterator an `join()` übergeben.

Ich würde noch einen Test einbauen ob tatsächlich alle Zeichen im ASCII-Bereich (0 bis 127) liegen, denn spätestens bei Zeichen mit einem Codepoint ≥1000 wird das dekodieren sonst nicht mehr funktionieren. Siehe auch die Frage nach dem Sinn der führenden 0(en).

Ich würde in neuem Code nicht mehr ``%`` zur Zeichenkettenformatierung verwenden. Es gibt die `format()`-Methode (und eine gleichnamige Funktion) und ab Python 3.6 f-Zeichenkettenliterale dafür.
Vielen Dank für diese ganzen Hinweis.
Ich programmiere so wie es unser Informatiklehrer es in er Schule beigebracht hat.
Wir haben bisher kaum was mit Pythonbefehle gemacht, sondern viel mit Schleifen und Listen umständlich gearbeitet.
Leider hat mir dein Ansatz nicht weitergeholen, den Code den du geschickt hast. Verstehe daraus nur Bahnhof.

LG
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wie __blackjack__ Dir schon gezeigt hat, kannst Du die Ziffern als Dreiergruppen aus dem String entnehmen. Das wird als slicing bezeichnet. Diese Dreiergruppen, die vom Typ String sind, kannst Du dann in einen Integer konvertieren, und diesen wiederum in einen Buchstaben. Diese fügst Du dann zum Ergebnisstring zusammen.

Dafür brauchst Du nicht mehr als eine Schleife, ähnlich der Lösung von Aufgabe 1.
Das geht auch als Einzeiler, aber das wird von euch gewiss nicht erwartet.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Falls Du Dich nicht traust, es selbst auszuprobieren:

Code: Alles auswählen

In [1]: int('077')
Out[1]: 77

In [2]: chr(int('077'))
Out[2]: 'M'
Antworten