Seite 1 von 1

suchen / ersetzten

Verfasst: Freitag 10. Februar 2006, 14:15
von CM
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

Verfasst: Freitag 10. Februar 2006, 14:27
von Bennhardt
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 :)

Verfasst: Freitag 10. Februar 2006, 14:32
von CM
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

Verfasst: Freitag 10. Februar 2006, 14:45
von Bennhardt
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.

Verfasst: Freitag 10. Februar 2006, 15:17
von helmut
... 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

Verfasst: Freitag 10. Februar 2006, 15:36
von mawe
... 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

Verfasst: Freitag 10. Februar 2006, 15:40
von Bennhardt
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.

Verfasst: Freitag 10. Februar 2006, 16:02
von CM
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

Verfasst: Freitag 10. Februar 2006, 16:15
von helmut
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

Verfasst: Freitag 10. Februar 2006, 18:45
von Bennhardt
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.

Verfasst: Freitag 10. Februar 2006, 19:28
von Joghurt
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])

Verfasst: Montag 13. Februar 2006, 12:42
von CM
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