Seite 1 von 1

Ersetzen mit string replace?

Verfasst: Montag 17. Oktober 2005, 20:01
von Gast
Hallo,

ich habe den folgenden Codesegment, um in bestimmten Context Key durch Value ersetzen. Es wurde schon passende Key im Text gefunden, aber trotzedem kein Ersetzen stattgefunden.

Kann ein Fachmann anschauen und ein Tip geben: Wo ich versehen habe und ist doch ein Fehler vorhanden im Code.

Das ähnliche Code habe ich schon per interative Fenster schon probiert und es funktioniert, nun den gesammten Codeteil nicht :cry:

Danke (BTW, wie kann ich den Einrücken im Editor berücksichtigen? so einfach habe ich gedacht!)

Code: Alles auswählen

newStr = str.strip()
			comm = newStr.find(r"(")
			if (len(newStr) == 0 or comm !=-1):
				commStr = newStr[:comm]
				for key in self.Basic2Py.keys():
					if (key == commStr):
						str.replace(key, self.Basic2Py[key])
						print "Key: %s Value: %s STR %s " % (key, self.Basic2Py[key], str)
						break
			else:
				print "*************", str
Edit (Leonidas): Code in Python-Tags gesetzt.

Re: Ersetzen mit string replace?

Verfasst: Montag 17. Oktober 2005, 21:35
von joe
Hi
Anonymous hat geschrieben:ich habe den folgenden Codesegment, um in bestimmten Context Key durch Value ersetzen. Es wurde schon passende Key im Text gefunden, aber trotzedem kein Ersetzen stattgefunden.
Den rückgabewert von replace() musst du auch einer variablen zuweisen.
s = s.replace()
joe

Re: Ersetzen mit string replace?

Verfasst: Montag 17. Oktober 2005, 22:40
von BlackJack
Grundsätzlich hat joe das Problem schon erkannt. Du machst es aber ein wenig zu umständlich. Das schöne an Dictionaries ist ja gerade das man direkt mit einem Schlüssel auf einen Eintrag zugreifen kann. Und durch suchst in einer Schleife nach dem dem Schlüssel um dann erst "direkt" zuzugreifen.

Ausserdem wird der Code nach dem ``if`` auch ausgeführt wenn es sich um eine Leerzeile gehandelt hat -- war das so gewollt?

Hier ist eine Lösung mit direktem Zugriff auf das Dictionary und ohne `replace()`:

Code: Alles auswählen

line = line.strip()
paren_position = line.find('(')
if paren_position != -1:
    basic_func = line[:paren_position]
    try:
        python_func = self.Basic2Py[basic_func]
        line = python_func + line[paren_position:]
    except KeyError, error:
        # Hier sollte der Fall behandelt werden, dass es keine passende
        # "Übersetzung" gab.
Falls Du doch `replace()` benutzen möchtest, dann denk daran das alle Vorkommen der ersten Zeichenkette durch die zweite ersetzt werden, es sei denn Du gibst als drittes Argument die maximale Anzahl von Ersetzungen an.

Und noch ein Stil-Hinweis: Klammern um Bedingungen sind in Python nicht nötig.

Verfasst: Dienstag 18. Oktober 2005, 07:01
von Gast
hi Joe und Blackjack!

vielen vielen Dank. Dieser Fehler hat mich so viel Zeit gekostet. Klar, unter Dos-Fenster wird automatisch ein Echo zurückgeliefert. Ab und zu wird Zuweisung gebracht und manchmal nicht, so muss ich doch aufpassen, sonst ärgert es mich und immer solche dumme Fragen stellen :lol:

zu Blackjack: Dank für den Hinweis über leere Zeilen und If-Vergleich. Der Code ist noch zu debuggen, so wollte ich die Leerzeile meinem Print nicht stören :roll: aber If-Vergleich werde ich auchaufpassen.

MfG

Verfasst: Dienstag 18. Oktober 2005, 07:09
von Gast
Hi Blackjack,

hast du zufällig Information über die Overhead oder Geschwindigkeit von try oder normale Schleife?

Dank dir noch mal! Wahrscheinlich replace wollte ich nicht benutzen, ich habe so gedacht, es ersetzt nur den ersten passenden Teil.

Ohne euch kann ich selst nicht mehr Programme schreiben, da ich selbst nicht mehr richtig denken könnte :P

Verfasst: Dienstag 18. Oktober 2005, 07:58
von jens
Anonymous hat geschrieben:hast du zufällig Information über die Overhead oder Geschwindigkeit von try oder normale Schleife?
Verstehe ich zwar nicht vollständig, aber vielleicht hats du folgendes gemeint:
try - except nutzt man immer dann, wenn die Ausnahme selten vorkommt... If Bla.has_key() o.ä. nimmt man immer dann, wenn es häufig nicht eintritt...
Weil eine Exception immer etwas länger dauern, sollte es bei einer Ausnahme bleiben und nicht die Regel sein...

Hier mal ein Hirnloses Beispiel:

Code: Alles auswählen

import time

keys = xrange(100000)
array = {}

start_time = time.time()
for i in keys:
    try:
        array[i]
    except KeyError:
        array[i] = None
print time.time() - start_time


array = {}

start_time = time.time()
for i in keys:
    if not array.has_key(i):
        array[i] = None
print time.time() - start_time
Erste variante brauch 0.34Sec und die zweite 0.08Sec...


Wenn es aber nicht um zig tausend interationen geht, immer try...except nehmen. Also einfach machen ;)

Verfasst: Dienstag 18. Oktober 2005, 10:55
von Gast
Hallo jens,

im Prinzip haben wir beide gleiches gemeint. Nur können wir nicht durch dein Beispiel nachweisen try ist langsamer, da ein Wert im Dic gesucht wurde
1. try eigentlich nur einmal (du hast doch eine Schleife)
2. die Schleife kann einmal laufen oder gesammte Dic prüfen.

Ich brauche nur ein Wert per Daumen :lol:

MfG