Zahlen aus Liste isolieren

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
Michael52
User
Beiträge: 5
Registriert: Mittwoch 16. März 2016, 17:58

Hallo zusammen,
versuche seit zwei Wochen Vektoren aus einer eingelesenen Liste zu isolieren.
Ich möchte aus dieser Liste :
['7555,14916', 'L', '6969,14916', '6969,15079', '7091,15079', '7134,15080', '7151,15082', '7167,15085', '7181,15089', '7193,15094', '7198,15097', '7203,15100', '7207,15104', '7211,15109', '7215,15113', '7218,15119', '7224,15130', '7228,15144', '7232,15160', '7234,15178', '7236,15199', '7237,15248', '7237,16057', '7237,16193', '7237,16217', '7235,16239', '7232,16258', '7228,16275', '7222,16290', '7218,16297', '7214,16303', '7209,16309', '7204,16314', '7198,16319', '7191,16323', '7176,16331', '7159,16337', '7138,16342', '7114,16346', '7056,16351', '6983,16352', '6969,16352', '6969,16474', '7826,16474', '7826,16352', '7813,16352', '7739,16351', '7680,16346', '7656,16342', '7635,16337', '7617,16331', '7602,16323', '7595,16319', '7589,16314', '7584,16309', '7579,16303', '7575,16297', '7571,16290', '7565,16275', '7560,16258', '7557,16239', '7556,16217', '7555,16193', '7555,16057', '7555,15705', '7556,15644', '7560,15584', '7565,15527', '7572,15474', '7581,15425', '7591,15380', '7603,15342', '7610,15324', '7616,15309', '7631,15281', '7647,15254', '7664,15229', '7684,15204', '7704,15182', '7726,15161', '7749,15141', '7773,15123', '7798,15107', '7823,15093', '7850,15081', '7876,15070', '7903,15062', '7931,15056', '7958,15053', '7986,15052', '8002,15052', '8019,15054', '8036,15057', '8053,15061', '8070,15065', '8087,15071', '8104,15078', '8120,15085', '8136,15094', '8151,15103', '8165,15113', '8179,15123', '8193,15134', '8205,15146', '8216,15158', '8226,15170', '8235,15184', '8244,15198', '8252,15214', '8259,15230', '8272,15266', '8282,15305', '8290,15349', '8296,15397', '8299,15450', '8301,15509', '8301,16057', '8301,16193', '8300,16217', '8299,16239', '8296,16258', '8291,16275', '8285,16290', '8281,16297', '8277,16303', '8272,16309', '8267,16314', '8261,16319', '8254,16323', '8239,16331', '8221,16337', '8200,16342', '8176,16346', '8117,16351', '8043,16352', '8030,16352', '8030,16474', '8886,16474', '8886,16352', '8873,16352', '8800,16351', '8742,16346', '8718,16342', '8697,16337', '8680,16331', '8665,16323', '8658,16319', '8652,16314', '8647,16309', '8642,16303', '8638,16297', '8634,16290', '8628,16275', '8624,16258', '8621,16239', '8619,16217', '8619,16193', '8619,16057', '8619,15526', '8616,15373', '8612,15316', '8606,15267', '8597,15225', '8585,15186', '8568,15147', '8548,15106', '8531,15076', '8512,15048', '8491,15021', '8469,14996', '8444,14973', '8419,14952', '8391,14932', '8362,14914', '8332,14899', '8301,14885', '8268,14873', '8234,14863', '8200,14855', '8164,14850', '8128,14846', '8091,14845', '8050,14846', '8011,14850', '7973,14856', '7936,14864', '7900,14875', '7865,14889', '7831,14905', '7798,14924', '7765,14945', '7733,14969', '7702,14996', '7671,15025', '7642,15057', '7612,15092', '7555,15170', '7555,14916"/>', '</g>', '</g>', '</g>', '</svg>']
die Zahlen in jedem Element in xpos und ypos speichern und die Buchstaben ignorieren. Hat jemand eine Idee wie man so ein Problem lösen kann ?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Michael52
Die Liste, die Du hier postest, scheint mir nicht die Liste zu sein, mit der Du tatsächlich arbeitest… :wink:

Jedenfalls sind die ('x,y') Elemente ja immer gleich aufgebaut: Ein String, der aus zwei Zahlen, getrennt durch ein Komma, besteht. Jetzt nimmst Du einfach jedes Element das ein Komma enthält, teilst es an der Komma-Stelle und wandelst die beiden Werte, die Du daraufhin erhältst, in Ganzzahlen. Dazu benötigst Du den in-Operator, die split-Methode und die `int()` built-in Funktion.

Am Ende solltest Du dann eine Liste in der Art haben:

Code: Alles auswählen

[(7555, 14916),
 (6969, 14916),
 (6969, 15079),
 (7091, 15079),
 (7134, 15080),
 (7151, 15082),
 (7167, 15085),
 (7181, 15089),
 (7193, 15094),
...]
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Michael52: Du solltest nicht versuchen ein XML-Dokument, und nichts anderes ist ja eine svg-Datei, nicht mit Zeichenkettenoperationen bearbeiten. Dafür gibt es xml.etree.ElementTree. Wenn Du direkt das passende Attribut ausliest, hast Du auch keine so kaputte Liste.
Michael52
User
Beiträge: 5
Registriert: Mittwoch 16. März 2016, 17:58

@Mutetella, nein das ist nicht die Liste mit der ich arbeite. Der ursprünglich eingelesene String war viel länger und es ist mir bereits gelungen den vorderen Textteil mit :

Code: Alles auswählen

#!/usr/bin/python3.5

import re
f = open("n.svg" , "r")
daten = f.read()
f.close()
x=0
s = []
newlist = (daten.split())

while x <= (len(newlist)-1):
        if ('d="M')in newlist[x]: # wenn d="M gefunden wird Position in a gespeichert
                a = x+1
        x+= 1
                

while a+1 <= (len(newlist)-1):
        if newlist[a+1].isdigit():
                print ("nicht ok")
        
        else :
                print(newlist[a+1])
        a+=1
abzutrennen, die Elemente (bestehend aus xpos und ypos) konnte ich bislang aber noch nicht trennen.

Vielen Dank erstmal für die Infos, ich versuche es weiter. Ich denke das Komma mit der "in" Funktion zu finden ist nicht das Problem, ich weiss aber noch nicht wie ich trennen soll. Schaun wir mal...

Gruß
Michael
Zuletzt geändert von Anonymous am Donnerstag 17. März 2016, 17:16, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
Michael52
User
Beiträge: 5
Registriert: Mittwoch 16. März 2016, 17:58

@sirius, das mit dem XML habe ich nocht nicht verstanden. Ist xml.etree.ElementTree eine Methode um solche Daten auzulesen ?
OK, werde ich mich mit beschäftigen.
Danke für die Info.
Gruß
Michael
BlackJack

@Michael52: Ja das ElementTree-Modul ist eine Möglichkeit XML zu verarbeiten. Zeichenkettenoperationen und reguläre Ausdrücke sind das definitiv nicht. Ansonsten könntest Du auch mal ein Python-Grundlagentutorial durcharbeiten. Wie man Zeichenketten an anderen Zeichenketten aufspaltet sollte eigentlich in jedem vorkommen. :-)

Edit: Und Du möchtest Dich mal mit dem selber schreiben von Funktionen und vernünftigen Namen beschäftigen. Alles auf Modulebene mit einbuchstabigen Namen — das will keiner lesen. Auch Du selbst nicht, wenn Du das in einem Monat mal wieder anschaust.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Michael52
Ich hab' Dir doch die Links zur Dokumentation geschickt… Mach' mal eine Pythonkonsole auf und gib dort

Code: Alles auswählen

>>> '7555,14916'.split(',')
ein. Somit wäre schon mal ein Anfang gemacht. Wobei Dir Sirius3 und BlackJack mit ihrem Hinweis auf das ElementTree Modul eine bessere Lösung als die meinige aufgezeigt haben.
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Michael52
User
Beiträge: 5
Registriert: Mittwoch 16. März 2016, 17:58

Hallo zusammen,
#!/usr/bin/python3.5
from tkinter import *
import re
#f = filedialog.askopenfile()
f = open("n.svg","r")
daten = f.read()
f.close()
newlist = (daten.split(","))



x = 0
while x <= (len(newlist)-1):
if ('d="M')in newlist[x]: # wenn d="M gefunden wird Position in a gespeichert
a = x+1
x+= 1
del(newlist[0:a])


y=1
while y < (len(newlist)-5):
print(newlist[y])
y += 1
jetzt habe ich zwar die Elemente isoliert, kann sie aber noch immer nicht in Ganzzahlen nach xpos und ypos wandeln und weiterbenutzen. Die Methode xml.etree ist mir viel zu kompliziert und hat mich nicht weitergebracht. Hat noch jemand eine Idee wie ich aus o.a. Liste die Vektoren isolieren kann ?
Gruß
Michael
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Michael52: svg ist ein XML-Format, das mit irgendetwas anderem als mit einem XML-Parser zu lesen, ist ein Fehler. Und so schwer ist das gar nicht:

Code: Alles auswählen

import xml.etree.ElementTree as ET
svg = ET.parse('n.svg')
path = svg.find('.//{http://www.w3.org/2000/svg}path').attrib['d']
Das Parsen der Pfad-Definition ist nicht so einfach.

Code: Alles auswählen

import re
points = [map(float, xy) for xy in re.findall('([+-]?\d*\.?\d*(?:[eE][+-]?\d+)?)\s*,\s*([+-]?\d*\.?\d*(?:[eE][+-]?\d+)?)', path)]
Michael52
User
Beiträge: 5
Registriert: Mittwoch 16. März 2016, 17:58

@sirius3: Wenn ich deinen Code benutzen passiert erstmal gar nichts. Mit print(points) zeigt er mir mehrere map object at....an. Wie ich im Internet gelesen habe soll das eine iterierbare Liste sein. Aber niemand erklärt dort wie ich die einzelnen Variablen (xpos uns ypos) daraus isolieren kann. Könntest du mir freundlicherweise einen weiteren Denkanstoss geben?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

ein iterierbares Objekt ist eines, über das man iterieren kann, z.B. mit einer for-Schleife:

Code: Alles auswählen

for x,y in points:
    print(x,y)
oder das man in eine Liste/Tuple konvertieren kann:

Code: Alles auswählen

[tuple(map(float, xy)) for xy in re.findall('([+-]?\d*\.?\d*(?:[eE][+-]?\d+)?)\s*,\s*([+-]?\d*\.?\d*(?:[eE][+-]?\d+)?)', path)]
Antworten