Seite 1 von 1

String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 11:44
von Mosnum
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

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 11:49
von Sirius3
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?

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 11:54
von DeaD_EyE
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]

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 12:23
von Sirius3
@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.

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 12:46
von kbr
@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.)

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 14:23
von Mosnum
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"

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 15:03
von kbr
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.

Re: String komplett umdrehen

Verfasst: Sonntag 1. Mai 2022, 15:49
von Mosnum
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.

Re: String komplett umdrehen

Verfasst: Montag 2. Mai 2022, 09:25
von __blackjack__
@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