line.split().reverse().join() in Python?

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
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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?!
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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:

Code: Alles auswählen

>>> " ".join(['123','456'])
123 455
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)
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

Das join eine String-Methode ist habe ich zwischenzeitlich rausgefunden - was durchaus plausibel ist. Aber sollte nicht zumindestens folgendes gehen:

Code: Alles auswählen

line = "Hallo Welt!".split().reverse()
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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Ausserdem ist es sowieso lesbarer, wenn man das ganze auf drei Zeilen schreibt...
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Code: Alles auswählen

line = "Hello World!"
print ' '.join(line.split().reversed())
So wird es aber funktionieren.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Argh. Ich Depp. So meinte ich:

Code: Alles auswählen

>>> print ' '.join(reversed(line.split()))
World! Hello
TUFKAB – the user formerly known as blackbird
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

und wie ists damit(dann sparst du dir den Aufruf von reverse()):

Code: Alles auswählen

print " ".join(line.split()[::-1])
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Oder eben, ab Python 2.4, reversed benutzen:

Code: Alles auswählen

' '.join(reversed("Hallo Welt".split()))
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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 ;)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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 :mrgreen: grüße zurück
TUFKAB – the user formerly known as blackbird
BlackJack

raist1314 hat geschrieben:und wie ists damit(dann sparst du dir den Aufruf von reverse()):

Code: Alles auswählen

print " ".join(line.split()[::-1])
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.
Antworten