Seite 1 von 1
line.split().reverse().join() in Python?
Verfasst: Freitag 25. November 2005, 00:04
von Ronnie
Ich spiele zur Zeit mit einigen Programmiersprachen rum und schaue wo ich am wenigsten überrascht werde. Anlass zu meiner Frage is folgender Code:
Code: Alles auswählen
line = "Hello World!"
print line.split().reverse().join(), "\n"
Kurz und knapp: Es geht nicht - jedenfalls nicht in python. Ruby macht genau das was ich erwartet habe. Wenn ich es schön aufteile und jeden Schritt in einer Variable zwischenspeichere geht es. Wieso geht es nicht am Stück?!
Verfasst: Freitag 25. November 2005, 00:18
von Joghurt
Was erwartest du denn? Dann die Wörter in umgekehrter Reihenfolge Zeile für Zeile ausgegeben werden?
In diesem Falle hast du gleich zwei der gewöhnungsbedürftigen Sachen in Python gefunden - lasse dich davon aber nicht abschrecken, meistens ist Python sehr intuitiv (intuitiver als andere Sprachen, meiner Erfahrung nach)
join ist eine Stringmethode, die für alle Elemente der Liste, die es übergeben bekommt, durch den String dessen Methode sie ist, getrennt wird.
Also:
Und reverse sowie sort arbeiten in-place! Und damit man das nicht vergisst, geben sie None zurück.
Richtig also:
Code: Alles auswählen
linelist ="Hallo Welt!".split()
linelist.reverse()
"\n".join(linelist)
Verfasst: Freitag 25. November 2005, 00:25
von Ronnie
Das join eine String-Methode ist habe ich zwischenzeitlich rausgefunden - was durchaus plausibel ist. Aber sollte nicht zumindestens folgendes gehen:
split erstellt eine Liste und reverse ist eine Methode die auf eine Liste angewandt werden kann?!
EDIT: Ah, okay - weil reverse inplace arbeitet - folgerichtig eigentlich zwar eine Methode ist, aber sich wie eine Prozedur verhält - und nix zurückgibt.
Verfasst: Freitag 25. November 2005, 00:32
von Joghurt
Ronnie hat geschrieben:EDIT: Ah, okay - weil reverse inplace arbeitet - folgerichtig eigentlich zwar eine Methode ist, aber sich wie eine Prozedur verhält - und nix zurückgibt.
Wenn du so willst; die offizielle Begründung ist, wie schon erwähnt, damit man nicht vergisst, dass reverse in-place arbeitet.
Verfasst: Freitag 25. November 2005, 09:44
von Clython
Ausserdem ist es sowieso lesbarer, wenn man das ganze auf drei Zeilen schreibt...
Re: line.split().reverse().join() in Python?
Verfasst: Freitag 25. November 2005, 10:41
von mitsuhiko
Code: Alles auswählen
line = "Hello World!"
print ' '.join(line.split().reversed())
So wird es aber funktionieren.
Verfasst: Freitag 25. November 2005, 11:11
von jens
blackbird hat geschrieben:So wird es aber funktionieren.
Jöp! So wird ein Schuh draus:
Code: Alles auswählen
line = "Hello World!"
line = line.split()
line.reverse()
print ' '.join(line)
Da, wie Joghurt schon festgestellt hat, reverse inplace arbeitet und somit ein None "zurück liefert"
Verfasst: Freitag 25. November 2005, 11:21
von mitsuhiko
Argh. Ich Depp. So meinte ich:
Code: Alles auswählen
>>> print ' '.join(reversed(line.split()))
World! Hello
Verfasst: Freitag 25. November 2005, 13:05
von raist1314
und wie ists damit(dann sparst du dir den Aufruf von reverse()):
Verfasst: Freitag 25. November 2005, 13:33
von Joghurt
Oder eben, ab Python 2.4, reversed benutzen:
Verfasst: Freitag 25. November 2005, 15:47
von Ronnie
blackbird hat geschrieben:Code: Alles auswählen
>>> print ' '.join(reversed(line.split()))
World! Hello
Das sieht witzigerweise fast genau wie die perl-variante aus:
Code: Alles auswählen
my $line = "Hello World!";
print join(' ', reverse split(/ /, $line)), "\n";
PS.: Grüße an die Ubuntu-Front

Verfasst: Freitag 25. November 2005, 20:30
von mitsuhiko
Ronnie hat geschrieben:blackbird hat geschrieben:Code: Alles auswählen
>>> print ' '.join(reversed(line.split()))
World! Hello
Das sieht witzigerweise fast genau wie die perl-variante aus:
Code: Alles auswählen
my $line = "Hello World!";
print join(' ', reverse split(/ /, $line)), "\n";
Jep. Gewisse Ähnlichkeiten sind da
Ronnie hat geschrieben:PS.: Grüße an die Ubuntu-Front

hehe

grüße zurück
Verfasst: Samstag 26. November 2005, 07:31
von BlackJack
raist1314 hat geschrieben:und wie ists damit(dann sparst du dir den Aufruf von reverse()):
Auf Kosten der Lesbarkeit. Da der OP auf "Überraschungen" in den Sprachen aus ist, sollte er sich aber den `stride` Parameter von der Slicing Syntax mal anschauen. Der kann sehr verwirrend sein, vor allen wenn man mit negativen `strides` arbeitet.