suchen / ersetzten

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo,

jetzt mal eine wahrscheinlich ganz einfach zu beantwortende Frage von mir - aber ich komme nicht drauf, bin wie vernagelt.

Also, ich habe folgenden String (den mir eine Software ausgibt, die ich zu hassen beginne):
"0,400,0,463,0,536,0,621,0,719,0,833 ..."
Und dieser String möchte ich ultimativ in folgende Liste überführen:
[0.4,0.463,0.536,0.621,0.719,0.833, ...]

Wäre wohl ganz einfach, wenn ich eine einfach Funktion für das Ersetzen jeden zweiten Kommas hätte. Bis jetzt mache ich das zu Fuß und es ist einfach häßlich? Weiß von euch jemand eine etwas elegantere Lösung?

Gruß,
Christian
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

Also man könnte ja durchiterieren (ääks) und eben bei jedem durchlauf testen, ob beim Teilen des Durchlaufzählers ein Rest rauskommt oder nicht. somit kannst du prüfen, ob du einen geraden oder ungeraden Zähler hast. damit KÖNNTE man dann eben ersetzen.
geht vielleicht auch anders, aber das fiel mir grad so ein :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Na ja, im Grunde mache ich so etwas: Ich zähle im Moment noch Kommate und ersetze, wenn Zähler teilbar durch zwei.
Deine Version würde nicht funktionieren (teilbar ohne Rest, wodurch auch immer, können alle der Ziffernfolgen sein), mal abgesehen davon, daß am Ende des Strings z. B. Folgen wie ...,1,e004,... stehen können.

Gruß,
Christian
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

So hab ich das getestet:

Code: Alles auswählen

from operator import mod
the_string = "0,400,0,463,0,536,0,621,0,719,0,833"
the_old_array = the_string.split(",")
the_new_array = []
print the_old_array
for v in range(len(the_old_array)-1):
    if mod(v,2):
        continue
    the_new_array.append(float(str(the_old_array[v]+"."+the_old_array[v+1])))
print the_new_array
sind keine Fehlerroutinen drin, aber vielleicht hilft das ja.
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

... und noch ein Vorschlag:

Code: Alles auswählen

str="0,400,0,463,0,536,0,621,0,719,0,833,0"
li1=str.split(',')
i=0
li2=[]
while i<int(len(li1)/2)*2:
    li2.append((li1[i]+"."+li1[i+1]).rstrip('0'))
    i += 2
print li2
#['0.4', '0.463', '0.536', '0.621', '0.719', '0.833']
Helmut
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

... und noch einer (sonst wirds ja fad :)):

Code: Alles auswählen

s = "0,400,0,300,0,200,0,100"
l = s.split(",")
print [".".join(x) for x in zip(*[l[i::2] for i in range(2)])]
Gruß, mawe
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

Ich mag leicht lösbare Aufgaben nicht! Gibts nicht was schwierigeres? :D :D
Schönes Wochendende!

Ach und: Die andren Lösungen gefallen mir sehr gut. Toll, dass man immer was dazulernen kann.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Na ja, im Grunde unterscheiden sich eure Version nicht allzusehr von meiner, aber ich habe ein wenig die Idee von Bennhardt aufgegriffen (spart mir zwei Zeilen Code) und habe jetzt:

Code: Alles auswählen

    value = value.strip('"').split(",") 
    new_value = []  
    
    if param == "Sizes":
        for v in range(len(value)-1):
            if len(new_value) == 0 or new_value[-1] < 100:
                if not ((v % 2) == 0): 
                    continue 
                new_value.append(float(value[v] + "." + value[v+1]))
            else:
                new_value.append(value[v])
        value = [float(x) for x in new_value]
(Wobei das "strip" und die "<100" daher kommen, daß ich den Fall etwas einfacher dagestellt habe, als er ist: Die Software, welche diese Daten generiert hat wirlich eine saumäßige Exportfunktion!)
mawe, Deine Lösung sieht zwar toll aus, erfüllt nur leider die Bedingungen nicht, weil diese Software eben die Daten dermaßen verfrutzelt, daß ... Ach, lassen wir das besser, es hat mich jetzt genug Nerven gekostet. Die Bemerkung von Dir Bennhardt ist leider nur ein schlechter Scherz für mich, denn schau mal auf die Zeile "if param == "Sizes"" (Jeder Parameter wird mit anderen Skalen assoziiert, obwohl alle in der selben Größenordnung sind! Und die Frage, wie ich mit dem Shiet denn überhaupt weiter rechnen soll, ist mit einem sauberen Import immer noch nicht beantwortet. Wahrscheinlich ist meine einzig wahre Option die: Kontaktaufnahme mit der Firma, die mein Meßgerät verkauft.)

Trotzdem: Vielen Dank für eure Hilfestellung!

Gruß,
Christian
helmut
User
Beiträge: 57
Registriert: Mittwoch 2. November 2005, 07:45
Wohnort: Dormagen

Hallo mawe,

welche Bewandtnis hat es mit dem Stern in der letzten Codezeile?

Code: Alles auswählen

print [".".join(x) for x in zip(*[l[i::2] for i in range(2)])]
Gruss, Helmut
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

CM hat geschrieben:Die Bemerkung von Dir Bennhardt ist leider nur ein schlechter Scherz für mich...
Naja, das anfänglich geschilderte Problem war ja gelöst. Das Drumherum wird ja jetzt erst klar ;)
Ich wollte dir sicher nicht ans Bein urinieren ( :shock: ) und wünsche dir viel Erfolg weiterhin! ;) ;)
Vielleicht kannst du ja noch mehr "Exportschlager" der Software (oder Messgerät?)anbringen, um mehr Unterstützung hier zu bekommen.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

helmut hat geschrieben:welche Bewandtnis hat es mit dem Stern in der letzten Codezeile?

Code: Alles auswählen

a = [1,2,3,"A","B","C"]
foo(a) # ruft foo mit a als Parameter auf
foo(*a) # ist identisch mit foo(a[0],a[1],a[2],a[3],a[4],a[5])
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Bennhardt hat geschrieben:Ich wollte dir sicher nicht ans Bein urinieren ...
Habe ich auch nicht so verstanden. (Das dumme in Emails und Forenbeiträgen ist, daß man nie zu viele Emoticons setzten kann, damit Ironie ankommt und doch leicht zu viele setzt, die irritierend wirken ...)

Gruß,
Christian
Antworten