Warum gibt es kein "".replace dass...

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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Warum gibt es kein "".replace dass...

Beitragvon sape » Dienstag 2. Januar 2007, 14:08

[OffTopic]
...von hinten anfängt Zeichen zu ersetzen?

Code: Alles auswählen

"foobar('\\') \\".rreplace('\\', ' ', 1) -> "foobar('\\') "


Finde ich schade, weil es sonst für jede wichtige string Funktion eine l und r variante gibt :/ So, muss man sich nun dafür eine eigene Funktion schreiben.

[/OffTopic]
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Beitragvon Costi » Dienstag 2. Januar 2007, 15:46

du kannst zb die einzelnen zeichen in einer liste packen, .reversen wieder in einen string umwandeln, .replacen, und dam wieder in einer liste, .reversen und zu guter letzt zum zwiten mal "".joinen.

ok, ne ich glaub das musste doch irgendwie einfacher gehen...
cp != mv
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Dienstag 2. Januar 2007, 15:52

So:

Code: Alles auswählen

In [6]: "foobar(x) x"[::-1].replace("x", "", 1)[::-1]
Out[6]: 'foobar(x) '

:)
Is natürlich Blödsinn, weils nur mit symmetrischen Ersetzungsteilstringsodersonstigendings geht.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Dienstag 2. Januar 2007, 17:38

mawe hat geschrieben:Is natürlich Blödsinn, weils nur mit symmetrischen Ersetzungsteilstringsodersonstigendings geht.


Naja, aber so schwer ist der naechste Schritt dann auch nicht mehr :D

Code: Alles auswählen

"foobar(abc) abc"[::-1].replace("abc"[::-1], "xyz"[::-1], 1)[::-1]
BlackJack

Beitragvon BlackJack » Dienstag 2. Januar 2007, 17:43

Von dem ganzen Zeichenketten-Umdrehen wird einem ja ganz schwindelig. :-)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 07:26

Ehm *hust* Leute ^^ Ja hab dafür eine Short-Funktion geschrieben die auch mit reverses arbeitet ;) Wollte den Thread nur mal öffnen weil ich das mal los werden wollte :) Vielleicht hat ja jemand nen guten draht zu Guido und sagt ihn mal das wir all eine r variante haben wollen ;)

lg

P.S.: Sorry merke gerade das ich das im flasche SubForum gepostet habe. Wollte das eigentlich ins OffTopic posten.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 3. Januar 2007, 08:20

sape hat geschrieben:Vielleicht hat ja jemand nen guten draht zu Guido und sagt ihn mal das wir all eine r variante haben wollen

Alle? :)
Ich will überhaupt was anderes:

Code: Alles auswählen

>>> "x a x b x".replace("x", "", 1)
a x b x
>>> "x a x b x".replace("x", "", 2)
x a b x
>>> "x a x b x".replace("x", "", -1)
x a x b

Hat vielleicht jemand nen guten Draht zu Guido ... :)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 08:29

Ne dann lieber so:

Code: Alles auswählen

>>> "a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>> "a|b|c|d".replace('|', '_', 1, reverse=False)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1, reverse=True)
a|b|c_d
>>>"a|b|c|d".replace('|', '_')
a_b_c_d
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 3. Januar 2007, 12:50

Ich denke mit negativen Zahlen wäre das konsistenter. Schließlich funktionieren Slices genau so.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 13:09

Leonidas hat geschrieben:Ich denke mit negativen Zahlen wäre das konsistenter. Schließlich funktionieren Slices genau so.
Nein. Das wäre inkonsistent.

1. Der zweite Parameter gibt an wie viele der gefundenen ersetzt werden sollen. Wenn -1 übergeben wird, werden alle gefundenen ersetzt -> Das ist die bisherige Implementierung!

Code: Alles auswählen

>>> "a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 2)
a_b_c|d
>>>"a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', -1) # So, -1 ist der Defaultwert ;)
a_b_c_d
>>>"a|b|c|d".replace('|', '_') # = replace('|', '_', -1)
a_b_c_d

Das jetzt als slice zu definieren würde das ganze nicht nur Inkonsistent machen sondern auch Inkompatibel zu allen Scripten vor Python X! ;)
Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'


Daher bin ich für einen dritten Parameter der angibt ob vorwärts angefangen wird zu replacen oder rückwärts (Das wäre auch zu allen anderen Python Versionen Kompatibel.

Code: Alles auswählen

>>>"a|b|c|d".replace('|', '_', 1, reverse=False)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1) # Default ist reverse=False wegen Kompatibilität ;)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1, reverse=True)
a|b|c_d


:)

Und wo wir gerad bei Konsistenz sind. Das Konsistenteste wäre eine r _und_ l variante einzuführen, da alle wichtigen string Methoden eine l und r variante definieren.

Code: Alles auswählen

>>>"a|b|c|d".rreplace('|', '_', 1)
"a|b|c_d"


EDIT: Fehler beseitigt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 3. Januar 2007, 13:21

sape hat geschrieben:Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'

Wer hat denn davon gesprochen Strings mutabel zu machen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 13:26

Leonidas hat geschrieben:
sape hat geschrieben:Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'

Wer hat denn davon gesprochen Strings mutabel zu machen?

Keiner. Du sagtest aber das negative Zahlen konsistenter wären, was einem slicing gleich kämme. Das wäre die Schlussfolgerung daraus:

Code: Alles auswählen

>>>"a|b|c|d".replace('|', '_', 3)
"a|b_c|d" # Das würde rauskommen wenn auf Index 3 ein | Vorhanden ist. Also wäre es äquivalente mit...
>>>if "a|b|c|d"[3] == '|': "a|b|c|d"[3] = '_'


Oder haben wir gerade ein Missverständnis?

EDIT: Fehler im Beispiel beseitigt!
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 13:31

Mit negativen Index würde das dann rauskomemn:

Code: Alles auswählen

>>>"a|b|c|d".replace('|', '_', -2)
"a|b|c_d"


Slicing -> und das hat dann mit der eigentlichen Funktion, so wie sie vorher war, nichts mehr zu tun.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Mittwoch 3. Januar 2007, 13:34

OK, stimmt -> String nicht mutable. Dann so ->

Code: Alles auswählen

test = "a|b|c|d"
if test[3] == '|':
    test = test[0:3] + '_' + test[3:]
    print test
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Beitragvon mawe » Mittwoch 3. Januar 2007, 14:47

*räusper*

Code: Alles auswählen

>>>"a|b|c|d".replace('|', '_', 3)
"a|b_c|d" # Das würde rauskommen wenn auf Index 3 ein | Vorhanden ist. Also wäre es äquivalente mit...
>>>if "a|b|c|d"[3] == '|': "a|b|c|d"[3] = '_'

Ich hab's eigentlich so gemeint, dass der 3. Parameter das x-te Pattern ist das ersetzt wird. HÄ?!? Ich sollte ein Buch schreiben, ich kann wunderbar formulieren :)

Code: Alles auswählen

 >>> "x a x b x".replace("x", "_", 2)
x a _ b x

Hier wird also das 2. "x" ersetzt. Um konsistent zu bleiben, müsste es eigentlich "1" sein, weil man ja bei "0" beginnt ... *kopfrauch*
Man könnte dann mit 4. und 5. Parameter eine Art range machen:

Code: Alles auswählen

>>> "xaxbxcxdxexfxgx".replace("x", "_", 1, 6, 2)
xa_bxc_dxe_fxgx

Na, wäre das nicht toll ... ich schreib Guido gleich mal eine mail mit meinem Vorschlag, der is sicher begeistert :D

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder