String komplett umdrehen

Code-Stücke können hier veröffentlicht werden.
Antworten
Mosnum
User
Beiträge: 7
Registriert: Mittwoch 27. April 2022, 09:19

Hey ich will eine Funktion erstellen um einen String komplett umzudrehen, also Zeichen für Zeichen. Ich bin mir so sicher, dass mein Code richtig ist. Was übersehe ich? Liegt es am Leerzeichen?

Code: Alles auswählen

def reverse_words(text):
    
    stringlength = len(text)
    
    slicedstring = text[stringlength::-1]
    
    return slicedstring
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit was rufst Du die Funktion auf und was ist das Ergebnis, das Du dann erwartest?
Wie weicht das Ergebnis der Funktion von dem, was Du erwartest ab?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1011
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das geht einfacher, wenn man die Länge einfach weglässt.

Code: Alles auswählen

def reverse_words(text):
    slicedstring = text[::-1]
    return slicedstring
BTW: Ich bin gerade etwas verwirrt, da folgender Slice einen leeren String liefert:

Code: Alles auswählen

s = "Hello"[6:-1:-1]
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@DeaD_EyE: die Variable ist auch überflüssig:

Code: Alles auswählen

def reverse_words(text):
    return text[::-1]
Das Ende ist immer exklusiv. 6 : -1 : -1 bedeutet also vom 6. Zeichen bis zum 5 Zeichen rückwärts, aber ohne das 5 Zeichen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@DeaD_EyE: ergänzend zu Sirius3: Der StopIndex ist nicht nur überflüssig sondern die Ursache. Bei einem Wert von -1 addressiert dieser das letzte Zeichen im String. Unabhängig vom StartIndex bekommst Du so bei einem decrement immer einen leeren String als Resultat.

Anders z.B. bei

Code: Alles auswählen

>>>"Hello"[6:-7:-1]
'olleH'
Hier ist der StopIndex weit genug "links" vom StartIndex.
(Zwar sind beide 'out of range', aber beim slicen wirft Python keinen IndexError.)
Mosnum
User
Beiträge: 7
Registriert: Mittwoch 27. April 2022, 09:19

Hey danke schonmal also.
Ich erwarte das hier : "This is an example!" ==> "sihT si na !elpmaxe"
"double spaces" ==> "elbuod secaps"
" d c b a " ==> " a b c d"
"elppa" ==> "apple"

letzteres gibt er auch richtig wieder, aber sobald Leerzeichen enthalten sind kriegt er es nicht mehr hin, anscheinend kann man Leerzeichen nicht slicen?

Edit : Ich denke das mit den Leerzeichen ist das Problem. Also bleibt mit nur eine "for" schleife?

Code: Alles auswählen

def reverse_words(str):
    return ' '.join(s[::-1] for s in str.split())
Hier hab ich das Problem, dass sobald 2 Leerzeichen hintereinander da sind, dass es auch nicht korrekt ausgegeben wird. Sprich:

"double spaced words" wird nicht zu "elbuod decaps sdrow"
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Deine Ursprungsfrage war einen String "umzudrehen". Dies wurde Dir auch gezeigt. Was Du aber möchtest ist wohl etwas anderes, wie sich nun herausstellt:

Du möchtest die einzelnen Wörter in einem String "reversen", dabei aber die genaue Zahl trennender Leerzeichen beibehalten. Falls das nun tatsächlich die richtige Interpretation sein sollte. Dies ist streng genommen auch ein Kandidat für http://www.catb.org/~esr/faqs/smart-questions.html. Lies es einmal durch, es ist ganz nett zu lesen. Als Anfänger mag einem der Text überheblich vorkommen – sobald man aber einmal die Seiten gewechselt hat (das ist ein fließender Übergang), stellt es sich ganz anders dar.

Zu Deiner Frage: ja, Du musst den String in einzelne Worte auseinander nehmen, diese jeweils "reversen" und Dir die Zahl der trennenden whitespaces merken, um die Wörter dann wieder korrekt zusammenzufügen. Mit .split() alleine geht diese Information verloren.
Mosnum
User
Beiträge: 7
Registriert: Mittwoch 27. April 2022, 09:19

kbr hat geschrieben: Sonntag 1. Mai 2022, 15:03 Deine Ursprungsfrage war einen String "umzudrehen". Dies wurde Dir auch gezeigt. Was Du aber möchtest ist wohl etwas anderes, wie sich nun herausstellt:

Du möchtest die einzelnen Wörter in einem String "reversen", dabei aber die genaue Zahl trennender Leerzeichen beibehalten. Falls das nun tatsächlich die richtige Interpretation sein sollte. Dies ist streng genommen auch ein Kandidat für http://www.catb.org/~esr/faqs/smart-questions.html. Lies es einmal durch, es ist ganz nett zu lesen. Als Anfänger mag einem der Text überheblich vorkommen – sobald man aber einmal die Seiten gewechselt hat (das ist ein fließender Übergang), stellt es sich ganz anders dar.

Zu Deiner Frage: ja, Du musst den String in einzelne Worte auseinander nehmen, diese jeweils "reversen" und Dir die Zahl der trennenden whitespaces merken, um die Wörter dann wieder korrekt zusammenzufügen. Mit .split() alleine geht diese Information verloren.
Hey,

hab den Fehler gefunden. .split(" ") löst mein Problem.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mosnum: Bei den Beispielen fällt " d c b a " ==> " a b c d" aus der Reihe. Warum sind da plötzlich die ”Worte” in umgekehrter Reihenfolge? Da hätte ich " d c b a " ==> " d c b a " erwartet, wie bei all den anderen Beispielen auch. Nach welchem Kriterium soll *der* Fall anders behandelt werden als die anderen Beispiele?

Code: Alles auswählen

#!/usr/bin/env python3
import re
import pytest


def reversed_words(text):
    return re.sub(r"\S+", lambda match: match.group()[::-1], text)


@pytest.mark.parametrize(
    "text, expected",
    [
        ("This is an example!", "sihT si na !elpmaxe"),
        ("double  spaces", "elbuod  secaps"),
        (" d c b a ", " a b c d"),  # FIXME Fails! What's wrong? Test case or code?
        ("elppa", "apple"),
    ],
)
def test_reversed_words(text, expected):
    assert reversed_words(text) == expected
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten