Python Programmierungsaufgabe?
Ich suche print()-Aufrufe, die jeweils bestimmte Teile der Eingabesequenz ausgeben. Die print()-Aufrufe können untereinander geschrieben werden (Achtung, die Reihenfolgeist wichtig). Da Indexing und Slicing sowohl für Strings als auch für Listen möglich ist, kann der gleiche Pythoncode alle Tests abdecken.
Die Ausgaben sollen in der folgenden Weise umgesetzt werden:
1. Das letzte Element soll mithilfe von Indexing ausgewählt werden.
2. Die Sequenz soll mithilfe von Slicing so reduziert werden, dass das erste und letzte Element wegfallen und nur die Mitte übrig bleibt.
3. Die Sequenz soll mithilfe von Slicing so reduziert werden, dass nur die zweite Hälfte übrig bleibt. Bei Sequenzen mit gerader Anzahl von Elementen soll genau die zweite Hälfte übrig sein, bei Sequenzen mit ungerader Anzahl von Elementen soll das Element in der Mitte mit ausgegeben werden.
4. Die Sequenz soll mithilfe von Indexing mit negativen Zahlen so reduziert werden, dass nur die letzten vier Elemente übrig bleiben.
5. Die Sequenz soll abhängig von der Länge reduziert werden: Sequenzen mit fünf oder weniger Elementen sollen ohne weiteres ausgegeben werden, aus Sequenzen mit genau acht Elementen sollen zwei Elementen am Anfang und zwei Elementen am Ende wegfallen, bei allen anderen Sequenzen sollen die letzten vier Elementen ausgegeben werden.
beispiel
Test Resultat
eingabe = "ABCDE"
F
BCD
CDE
BCDE
ABCDE
eingabe = "FGHIJKLMN"
N
GHIJKLM
JKLMN
KLMN
KLMN
eingabe = [1, 2, 3, 4, 5, 6, 7, 8]
8
[2, 3, 4, 5, 6, 7]
[5, 6, 7, 8]
[5, 6, 7, 8]
[3, 4, 5, 6]
2 Antworten
https://docs.python.org/3/tutorial/introduction.html#lists
Lesen udn anwenden. Falls es konkrete Fragen geben sollte, kannst Du sie entsprechend stellen.
Die Aufgabe ist teilweise nicht genau spezifiziert, von daher sollte das soweit passen.
>>> [1][1:-1]
[]
Slicing erzeugt im Zweifelsfall eine leere Liste,, man könnte sich da also das if ggf. auch sparen.
Witzigerweise:
if len(sequence) % 2 == 0:
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen (gerade Anzahl)
else:
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen (ungerade Anzahl)
Hier prüfst Du die Mindestlänge nicht, machst aber eine unnötige Unterscheidung, denn die Ganzzahldivision rundet eutomatisch ab, sodaß bei ungerader Anzahl automatisch das mittlere Element mitgenommen wird.
Erstmal vielen lieben Dank !
Ich habe nun nochmal drüber geschaut und es hoffentlich richtig ausgebessert:-)
so schaut es jetzt aus:
def print_sequence_parts(sequence):
print(sequence[-1]) # Das letzte Element mithilfe von Indexing auswählen
print(sequence[1:-1]) # Die Mitte der Sequenz mithilfe von Slicing auswählen
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen
print(sequence[-4:]) # Die letzten vier Elemente mithilfe von negativem Indexing auswählen
print(sequence) # Direkt die gesamte Sequenz ausgeben
# Testfälle
eingabe1 = "ABCDE"
eingabe2 = "FGHIJKLMN"
eingabe3 = [1, 2, 3, 4, 5, 6, 7, 8]
print_sequence_parts(eingabe1)
print_sequence_parts(eingabe2)
print_sequence_parts(eingabe3)
Bei der letzten Teilaufgabe mußt Du natürlich schon noch die Fälle unterschieden, wird ja auch explizit gefordert.
Oh sorry stimmt 😅
def print_sequence_parts(sequence):
print(sequence[-1]) # Das letzte Element mithilfe von Indexing auswählen
print(sequence[1:-1]) # Die Mitte der Sequenz mithilfe von Slicing auswählen
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen
print(sequence[-4:]) # Die letzten vier Elemente mithilfe von negativem Indexing auswählen
if len(sequence) <= 5:
print(sequence) # Sequenzen mit fünf oder weniger Elementen direkt ausgeben
elif len(sequence) == 8:
print(sequence[2:-2]) # Zwei Elemente am Anfang und am Ende weglassen (genau acht Elemente)
else:
print(sequence[-4:]) # Die letzten vier Elemente für alle anderen Sequenzen auswählen
# Testfälle
eingabe1 = "ABCDE"
eingabe2 = "FGHIJKLMN"
eingabe3 = [1, 2, 3, 4, 5, 6, 7, 8]
print_sequence_parts(eingabe1)
print_sequence_parts(eingabe2)
print_sequence_parts(eingabe3)
Ich denke, das passt soweit. Testfälle hast Du geprüft?
bei Mir kommt ein syntax error also invalid non-printable character irgendwie
Habe nochmal genauer geschaut, dort steht ungültiges Zeichen im Token, also irgendwie in jeder zeile
Deinen Code kannst du entweder in einem Online-Editor (wie Ideone oder OnlineGDB) oder nach Python-Installation in der Konsole oder in der IDLE selbst testen.
Hatte es bei Visual code probiert und dort kam das dann
Und wie könnte ich jetzt am besten vorgehen
In der unteren Leiste von VS Code wird die Kodierung für deine Datei angezeigt (UTF-8/Windows 1252/ISO-8859-1/...). Klicke auf diese Fläche und wähle Save with Encoding > UTF-8. Öffne die Datei anschließend erneut und prüfe nochmal.
def print_sequence_parts(sequence):
print(sequence[-1]) # Das letzte Element mithilfe von Indexing auswählen
print(sequence[1:-1]) # Die Mitte der Sequenz mithilfe von Slicing auswählen
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen
print(sequence[-4:]) # Die letzten vier Elemente mithilfe von negativem Indexing auswählen
if len(sequence) <= 5:
print(sequence) # Sequenzen mit fünf oder weniger Elementen direkt ausgeben
elif len(sequence) == 8:
print(sequence[2:-2]) # Zwei Elemente am Anfang und am Ende weglassen (genau acht Elemente)
else:
print(sequence[-4:]) # Die letzten vier Elemente für alle anderen Sequenzen auswählen
# Testfälle
eingabe1 = "ABCDE"
eingabe2 = "FGHIJKLMN"
eingabe3 = [1, 2, 3, 4, 5, 6, 7, 8]
print_sequence_parts(eingabe1)
print_sequence_parts(eingabe2)
print_sequence_parts(eingabe3)
Hiermal Dein Source mit Formatierung, den habe ich so 1:1 an python gefüttert ohne Fehlermeldungen.
Die Frage ist also in welcher Texkodierung Dein Editor speichert und was Dein python als Standardkodierung erwartet.
# -*- coding: utf-8 -*-
Neben dem von RegEx gesagten, kannst Du so am Anfang der Datei auch die Kodierung festlegen, speicherst Du in utf-8 und schreibst das in den Source, dann kann ein Interpreter, der eigentlich z.B: eine iso-8859-1 erwartet den Quellcode trotzdem verarbeiten.
Ggf. kann VS sogar aus dem Kommentar direkt die richtige Kodierung fürs Abspeichern ermitteln.
Dann weiß ich Bescheid:) vielen Dank !!
1) Das letzte Element soll mithilfe von Indexing ausgewählt werden.
Hierzu verwendet man den Index -1. Minuszahlen als Indexangabe bedeuten, dass von hinten bzw. rechts gezählt wird:
print(eingabe[-1])
# "ABCDE" → "E"
# "FGHIJKLMN" → "N"
# [1, 2, 3, 4, 5, 6, 7, 8] → 8
Siehe dazu den Abschnitt „Negative Indexing“ bei W3Schools.
2) Die Sequenz soll mithilfe von Slicing so reduziert werden, dass das erste und letzte Element wegfallen und nur die Mitte übrig bleibt.
Man gibt den Start- und den Endindex an, getrennt durch einen Doppelpunkt. Der Ausschnitt des Strings (Substring) oder der Liste beginnt beim zweiten Zeichen (Index 1) und endet vor dem letzten (Index -1):
print(eingabe[1:-1])
# "ABCDE" → "BCD"
# "FGHIJKLMN" → "GHIJKLM"
# [1, 2, 3, 4, 5, 6, 7, 8] → [2, 3, 4, 5, 6, 7]
# und auch: "XY" → "" sowie "Z" → ""
Siehe dazu diese Seite bei W3Schools.
3) Die Sequenz soll mithilfe von Slicing so reduziert werden, dass nur die zweite Hälfte übrig bleibt. Bei Sequenzen mit gerader Anzahl von Elementen soll genau die zweite Hälfte übrig sein, bei Sequenzen mit ungerader Anzahl von Elementen soll das Element in der Mitte mit ausgegeben werden.
Die Länge des Strings oder der Liste (len()-Funktion) teilt man mit dem Operator // durch 2. Mit zwei Schrägstrichen/Slashes statt mit einem wird das Ergebnis der Division abgerundet (entspricht der floor()-Funktion), wodurch auch gleich das Zeichen oder Element in der Mitte des Strings bzw. der Liste mitkommt. Hinter dem Doppelpunkt gibt man keine Zahl an, wenn alle übrigen Zeichen oder Elemente bis zum Ende ausgegeben werden sollen:
print(eingabe[len(eingabe) // 2:])
# "ABCDE" → "CDE"
# "FGHIJKLMN" → "JKLMN"
# [1, 2, 3, 4, 5, 6, 7, 8] → [5, 6, 7, 8]
# und auch: "A" → "A"
Siehe dazu diese Frage bei StackOverflow.
4) Die Sequenz soll mithilfe von Indexing mit negativen Zahlen so reduziert werden, dass nur die letzten vier Elemente übrig bleiben.
-4 gibt man als Startindex an, wobei man den Endindex auslässt. Dadurch werden ab dem 4. Zeichen von rechts bis zum Ende des Strings oder der Liste ausgewählt:
print(eingabe[-4:])
# "ABCDE" → "BCDE"
# "FGHIJKLMN" → "KLMN"
# [1, 2, 3, 4, 5, 6, 7, 8] → [5, 6, 7, 8]
# und auch: "XY" → "XY"
Siehe dazu diese Frage bei StackOverflow.
5) Die Sequenz soll abhängig von der Länge reduziert werden: Sequenzen mit fünf oder weniger Elementen sollen ohne weiteres ausgegeben werden, aus Sequenzen mit genau acht Elementen sollen zwei Elemente am Anfang und zwei Elemente am Ende wegfallen, bei allen anderen Sequenzen sollen die letzten vier Elementen ausgegeben werden.
Dazu verwendet man if, elif und else, um die Länge des Strings oder der Liste zu überprüfen. Alles weitere ist bereits bekannt:
if len(eingabe) <= 5:
print(eingabe)
elif len(eingabe) == 8:
print(eingabe[2:-2])
else:
print(eingabe[-4:])
# "ABCDE" → "ABCDE"
# "FGHIJKLMN" → "KLMN"
# [1, 2, 3, 4, 5, 6, 7, 8] → [3, 4, 5, 6]
def print_sequence_parts(sequence):
print(sequence[-1]) # Das letzte Element mithilfe von Indexing auswählen
if len(sequence) > 2:
print(sequence[1:-1]) # Die Mitte der Sequenz mithilfe von Slicing auswählen
if len(sequence) % 2 == 0:
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen (gerade Anzahl)
else:
print(sequence[len(sequence)//2:]) # Zweite Hälfte auswählen (ungerade Anzahl)
if len(sequence) >= 4:
print(sequence[-4:]) # Die letzten vier Elemente mithilfe von negativem Indexing auswählen
if len(sequence) <= 5:
print(sequence) # Sequenzen mit fünf oder weniger Elementen direkt ausgeben
elif len(sequence) == 8:
print(sequence[2:-2]) # Zwei Elemente am Anfang und am Ende weglassen (genau acht Elemente)
else:
print(sequence[-4:]) # Die letzten vier Elemente für alle anderen Sequenzen auswählen
# Testfälle
eingabe1 = "ABCDE"
eingabe2 = "FGHIJKLMN"
eingabe3 = [1, 2, 3, 4, 5, 6, 7, 8]
print_sequence_parts(eingabe1)
print_sequence_parts(eingabe2)
print_sequence_parts(eingabe3)
ist es so korrekt ?