Slicing Aufgaben

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
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

Hallo liebe Comm,
ich habe vor kurzen angefangen mich mit Python zu beschäftigen. Und habe mir nun das Buch "Einführung in Python 3 von Bernd Klein" zugelegt.
Dort bekomme ich nun eine Aufgabe wo ich nicht weiter komme. Und zwar soll ich 2 Sätze die aus einem Buchstabensalat bestehen wieder
ganze Sätze bilden. Hier mal die Sätze:

5. Aufgabe:
Welche zwei Sätze verbergen sich hinter dem folgenden scheinbaren Buchstaben-
salat:
’DIenr diesmt Sdienrn eb eisstte HLielhfree rz,u rd eSre lsbiscthh inlafceh iumnmde rn
aucnhs eürbee rofbleürssstieg Mmaaxcihmte..’

Was in dem Buch Bisher gezeigt wurde ist Folgenes:

Man versteht dies am besten an einem Beispiel:
>>> txt = "Hello World"
>>> txt[1:5]
'ello'
>>> txt[0:5]
'Hello'
>>> txt = "Hello World"
>>> txt[0:5]
'Hello'
Lässt man den Anfangswert weg (z.B. [:5] ), beginnt das Ausschneiden am Anfang des
Strings (oder der Liste). Analog kann man auch den Endwert weglassen, um alles bis zum
Ende zu übernehmen ( z.B. [6:] ) Lässt man Anfangs- und Endwert weg, erhält man den
ganzen String (oder entsprechend die ganze Liste oder Tupel) zurück:
'Hello'
>>> txt[0:-6]
'Hello'
>>> txt[:5]
'Hello'
>>> txt[6:]
'World'
>>> txt[:]
'Hello World'
Das folgende Beispiel zeigt, wie sich dies bei Listen auswirkt:
>>> colours = ['red', 'green', 'blue']
>>> colours[1:3]
['green', 'blue']
>>> colours[2:]
['blue']
>>> colours[:2]
['red', 'green']
>>>
>>> colours[-1]
'blue'Der Slicing-Operator funktioniert auch mit drei Argumenten. Das dritte Argument gibt
dann an, das wievielte Argument jedes Mal genommen werden soll, d.h. s[begin, end, step].
Ausgegeben werden dann die folgenden Elemente von s: s[begin], s[begin + 1 * step], ...
s[begin + i * step], solange (begin + i * step) < end ist. txt[::3] gibt jeden dritten Buchstaben
eines Strings aus.
Beispiel:
>>> txt = "Python ist ganz toll"
>>> txt[2:15:3]
'tnsgz'
>>> txt[::3]
'Ph ta l'

Mein Lösungsversuche waren bisher Folgende:
>>> s = 'DIenr diesmt Sdienrn eb eisstte HLielhfree rz'
>>> s[::2]
'Derdem der besteHilfe z'
>>> s[1::2]
'In istSinne ist Lehrer'
>>> s[0::2]
'Derdem der besteHilfe z'
>>> s[0::1]
'DIenr diesmt Sdienrn eb eisstte HLielhfree rz'
>>> s[0:1:1]
'D'
>>> s[0:2:1]
'DI'
>>>
>>> s[0:2:1]
'DI'
Aber das führte zu keinem befriedigendem Ergebnis. Habe ich etwas vergessen zu versuchen ? oder was mache ich Falsch ?

Aber wie stelle ich es nun an die Sätze zu einem ganzen wieder zurück zu führen ? Ich hoffe das mir jemand ein paar hilfestellungen oder anregungen geben kann damit ich die Aufgabe bewältigen kann.
BlackJack

@Mortifer: Da ist es echt schwierig zu helfen ohne die Lösung zu verraten. Denn eigentlich ist das ganz einfach. Schau doch mal ob Du ohne Computer heraus bekommst, wie die beiden Sätze lauten. Es reicht auch wenn Du einen erkennst, denn der andere ist dann das was übrig bleibt.

Hier sind auch die Leerzeichen extrem wichtig! Du hast da immer nur eines zwischen den Buchstabenfolgen, es müssen manchmal aber auch zwei sein.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

wie meinst du das mit 2 leerzeichen? das verstehe ich nicht.
BlackJack

@Mortifer: Du hast da doch Leerzeichen in den Ausgangsdaten. Und Du hast da immer nur *ein* Leerzeichen, ich bin aber ziemlich sicher das das an einigen Stellen *zwei* Leerzeichen sein müssten.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

wie soll ich das denn anstellen da 2 Leerzeichen hinzuzufügen ?
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

@Mortifer: Du hast die Aufgabe doch aus einem Buch abgetippt und beim Abtippen nicht darauf geachtet, dass zwischen den Wörtern manchmal zwei anstelle von einer Leerstelle sind.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

Aso jetzt verstehe ich was gemeint ist, werde mal den Fehler suchen. Das Buch habe ich in PDF Format evtl ist da ein Fehler drin.
Und erst einmal Danke für die Ratschläge und Hilfe.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

Ich habe jetzt mal Folgendes probiert und gesehen das dort 2 Leerzeichen teilweise vorhanden sind.

Code: Alles auswählen

>>> s = 'DIenr diesmt Sdienrn eb eisstte HLielhfree rz, u rd eSre Isbiscthh inIafceh iumnmde rnaucnhs eürbee rofbleürssstieg Mmaaxcihmte'
>>> s[::2]
'Derdem der besteHilfe z  der sich nachimmerach überflüssigMaxime'
>>> s[1::2]
'In istSinne ist Lehrer,ur SeIbsthiIfe und nunsere oberste macht'
>>> s[::2]
'Derdem der besteHilfe z  der sich nachimmerach überflüssigMaxime'
>>> s = 'DIenr diesmt Sdienrn eb eisstte HLielhfree rz , u rd eSre Isbiscthh inIafceh iumnmde rnaucnhs eürbee rofbleürssstieg Mmaaxcihmte'
>>> s[::2]
'Derdem der besteHilfe z,ur SeIbsthiIfe und nunsere oberste macht'
>>> s[1::2]
'In istSinne ist Lehrer   der sich nachimmerach überflüssigMaxime'
>>> s = 'DIenr diesmt Sdienrn eb eisstte HLielhfree rzu rd eSre Isbiscthh inIafceh iumnmde rnaucnhs eürbee rofbleürssstieg Mmaaxcihmte'
>>> s[::2]
'Derdem der besteHilfe z der sich nachimmerach überflüssigMaxime'
>>> s[1::2]
'In istSinne ist Lehrerur SeIbsthiIfe und nunsere oberste macht'
>>>
vom z zu der waren 2 Leerzeichen, ich habe dann mit dem komma experimentiert und es dann einfach mal weg gelassen und nun ist dort nur noch 1 leerzeichen. Kann es sein das von dem vorgegebenen Text grundauf Fehler drin sind ? Oder kann das durch copi/past passieren ?
Zuletzt geändert von Anonymous am Dienstag 15. August 2017, 15:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Mortifer: Beim kopieren aus einem PDF kann es durchaus passieren, dass Leerzeichen nicht stimmen.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

Habe den Text jetzt nochmal Kopiert und hier eingefügt evtl ist ja ein Fehler drin, kann das sein ?

5. Aufgabe:
Welche zwei Sätze verbergen sich hinter dem folgenden scheinbaren Buchstaben-
salat:
’DIenr diesmt Sdienrn eb eisstte HLielhfree rz,u rd eSre lsbiscthh inlafceh iumnmde rn
aucnhs eürbee rofbleürssstieg Mmaaxcihmte..’
Hinweis: Benutzen Sie Slicing!
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

BlackJack hat geschrieben:@Mortifer: Du hast da doch Leerzeichen in den Ausgangsdaten. Und Du hast da immer nur *ein* Leerzeichen, ich bin aber ziemlich sicher das das an einigen Stellen *zwei* Leerzeichen sein müssten.
Ist das so beabsichtig das an einigen stellen *zwei* Leerzeichen sein müssten aber blos *ein* Leerzeichen angegeben ist ?
BlackJack

@Mortifer: Ich denke nicht. Das wäre ja auch irgendwie gemein, eine Aufgabe zu stellen die so gar nicht lösbar ist.

Wie sieht das denn in dem Buch aus? Kannst Du da visuell erkennen ob zwischen zwei Zeichen in dem Buchstabensalat *ein* oder *zwei* Leerzeichen sind?

Ansonsten kannst Du ja einfach an jeder Stelle wo ein Leerzeichen ist, von vorne angefangen, mal probieren ob es mit einem Leerzeichen mehr eine etwas verständlichere Lösung gibt. So habe ich das gelöst. :-)
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

Dann kann ich ja auch lange experimentieren...
habe mir nun die Lösung angesehen und siehe da in dem gefilde der Lösung sind an gewissen stellen *zwei* Leerzeichen zu sehen.

Hier der Text in meiner Aufgabe:
’DIenr diesmt Sdienrn eb eisstte HLielhfree rz,u rd eSre lsbiscthh inlafceh iumnmde rn
aucnhs eürbee rofbleürssstieg Mmaaxcihmte..’

Und hier der Text in der Lösung:
''DIenr__diesmt__Sdienrn eb eisstte__HLielhfree rz,u rd eSre lsbiscthh inlafceh__iumnmde rn aucnhs eürbee rofbleürssstieg Mmaaxcihmte..'

Und hier die ganze Lösung:
5. Aufgabe
Stellt man die Schrittweite des Sclicing-Operators auf step = 2, kann man die beiden ver-
borgenen Sätze extrahieren, wenn man einmal mit dem Index 0 und einmal mit dem Index
1 beginnt:
>>> s = 'DIenr diesmt Sdienrn eb eisstte HLielhfree rz,u rd eSre
lsbiscthh inlafceh iumnmde rn aucnhs eürbee rofbleürssstieg
Mmaaxcihmte..'
>>> s[::2]
'Der ist der beste Lehrer, der sich nach und nach überflüssig macht.'
>>> s[1::2]
'In dem Sinne ist Hilfe zur Selbsthilfe immer unsere oberste Maxime.'
>>>
Vielleicht interessiert es Sie auch, wie wir den String erzeugt hatten. Um das Folgende zu
verstehen, müssen Sie allerdings das Kapitel 26 (Listen-Abstraktion/List Comprehension)
bereits bearbeitet haben.
>>> s = "Der ist der beste Lehrer, der sich nach und nach überflüssig
macht."
>>> t = "In dem Sinne ist Hilfe zur Selbsthilfe immer unsere oberste
Maxime."
>>> s = "".join(["".join(x) for x in zip(s,t)])
>>> s
'DIenr diesmt Sdienrn eb eisstte HLielhfree rz,u rd eSre lsbiscthh
inlafceh iumnmde rn aucnhs eürbee rofbleürssstieg Mmaaxcihmte..'

hmm irgend wie sind die 2 leerzeichen weg wenn ich es hier poste habe sie nun mit unterstrichen kenntlich gemacht.
Zuletzt geändert von Mortifer am Dienstag 15. August 2017, 21:40, insgesamt 1-mal geändert.
Mortifer
User
Beiträge: 9
Registriert: Dienstag 15. August 2017, 12:50

BlackJack hat geschrieben: Ansonsten kannst Du ja einfach an jeder Stelle wo ein Leerzeichen ist, von vorne angefangen, mal probieren ob es mit einem Leerzeichen mehr eine etwas verständlichere Lösung gibt. So habe ich das gelöst. :-)
Wie bist du denn darauf gekommen 2 Leerzeichen zu verwenden ? sowas gibt es doch in keinem deutschen satz, oder irre ich mich da ?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Mortifer: Mustererkennung 8)
BlackJack

@Mortifier: Ich denke im Buch ist genau das passiert was Du hier in Deinem Forumsbeitrag siehst: Beim setzen des Textes sind die zwei Leerzeichen zu einem geworden, denn normalerweise gibt es diese Unterscheidung bei normalem Fliesstext nicht. HTML, aber auch bestimmte Textsatzsysteme wie beispielsweise LaTeX, ignorieren deshalb mehrere Leerzeichen oder Zeilenumbrüche im Quelltext für das Dokument. Man muss dort extra kennzeichnen wenn Text exakt so wiedergegeben werden soll wie er mit Leerzeichen und Umbrüchen im Quelltext steht. Bei HTML ist das beispielsweise das <pre>-Tag für vorformatierten Text („preformatted text“), bei LaTeX die `verbatim`--Umgebungen, und hier im Forum die `code`- oder `codebox`-Tags.

In *einem* deutschen Satz gibt es keine zwei aufeinanderfolgenden Leerzeichen, aber man hat hier *zwei* Sätze deren Zeichen abwechselnd in der Zeichenkette stehen. Und da kann es natürlich vorkommen, dass ein Leerzeichen aus Satz A direkt neben einem Leerzeichen aus Satz B stehen kann. Du warst ja schon auf der richtigen Spur, und da sieht man das Worte direkt aneinander kleben, also offensichtlich Leerzeichen fehlen.
BlackJack

@Mortifier: Das kannst Du übrigens als Ausgangspunkt für ein paar eigene Aufgaben/Fragen nehmen. Vielleicht noch nicht jetzt gleicht, sondern wenn Du schon etwas mehr programmieren kannst. Ich hatte mir für die Lösung nämlich ein kleines GUI-Programm geschrieben, mit einem Eingabefeld für den ”verschlüsselten” Text und zwei Labels die die ”entschlüsselten” Sätze anzeigen, und die immer aktualisiert werden wenn man im Eingabefeld etwas ändert.

Für so eine GUI braucht man dann schon objektorientierte Programmierung (OOP), aber man könnte sich auch ohne GUI alleine mit Zeichenkettenoperationen, Ein- und Ausgabe, und Schleifen schon eine Lösungshilfe programmieren wo der Benutzer für die Leerzeichen entscheiden kann ob da jeweils eines oder zwei sein sollen/müssen.

Interessant wäre auch ob man es vielleicht auch automatisch Lösen kann, oder zumindest die wahrscheinlichsten Lösungen automatisch ermitteln kann, wenn man eine Datei mit deutschen Worten hinzuzieht, um so die Möglichkeiten mit den meisten Treffern/dem wenigstens ”Müll” aus allen Möglichkeiten heraus zu filtern.
Antworten