Löschen bestimmter Bereiche im String

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
geograph
User
Beiträge: 6
Registriert: Freitag 11. Juli 2014, 14:34

Hallo zusammen,

Ich habe mehrere Strings mit Koordinaten die folgendermaßen aufgebaut sind: "x1-Koordinate y1-Koordinate z1-Koordinate x2-Koordinate y2-Koordinate z2-Koordinate x3-Koordinate ...."

Konkret sieht einer dieser Strings folgendermaßen aus: "30.0 0.0 0.0 30.0 30.0 0.0 50.0 30.0 0.0 50.0 0.0 0.0"

Die Koordinaten liegen also alle in einem String und werden jeweils durch ein Leerzeichen voneinander getrennt.

Ich möchte nun die Fläche der x-y-Ebene berechnen und dafür brauche ich nur die x- und y-Koordinate. Aus diesem Grund möchte ich die z-Koordinaten aus dem String löschen.


Ich weiß jetzt nicht, wie ich an dieses Problem am besten herangehen soll. Ich hatte mir überlegt, alle Einträge zwischen dem zweiten und dritten Leerzeichen zu löschen, dann wiederum zwischen dem fünften und sechsten Leerzeichen usw. Nur weiß ich nicht wie ich das lösen könnte.

Ich würde mich freuen wenn ihr mir ein paar Tipps geben könntet.

Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

geograph hat geschrieben: Ich möchte nun die Fläche der x-y-Ebene berechnen und dafür brauche ich nur die x- und y-Koordinate. Aus diesem Grund möchte ich die z-Koordinaten aus dem String löschen.
Wieso willst Du auf dem String operieren? Für das Rechnen musst Du den String eh parsen und die Werte in Zahlen überführen. Das Parsen geht ja einfach mittels ``string.split``-Methode. Mittels Slicing kannst Du dann die Werte wählen, die Du Konvertieren willst. Die hinteren ignorierst Du dann einfach.

Z.B. so (ungetestet):

Code: Alles auswählen

data = "30.0 0.0 0.0 30.0 30.0 0.0 50.0 30.0 0.0 50.0 0.0 0.0"
coordinates = [float(value) for value in data.split()[:6]]
Edit: Oops, zu schnell gelesen! Vergiss es. Man muss ja Werte zwischendurch wählen... mein Ansatz ist also falsch! momentchen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst das Rezept für eine Funktion ``grouper`` aus dem ``itertools``-Modul nutzen:

Code: Alles auswählen

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

[v for v in grouper(data.split(), 3)]
>[('30.0', '0.0', '0.0'),
 ('30.0', '30.0', '0.0'),
 ('50.0', '30.0', '0.0'),
 ('50.0', '0.0', '0.0')]

# und dann nur x + y:
[[x, y] for x, y, _ in grouper(data.split(), 3)]
> [['30.0', '0.0'], ['30.0', '30.0'], ['50.0', '30.0'], ['50.0', '0.0']]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
geograph
User
Beiträge: 6
Registriert: Freitag 11. Juli 2014, 14:34

SUPER! Danke dir! Hat geklappt!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn Du viel mit solchen Daten zu tun hast, solltest Du Dir mal ``numpy`` angucken; ich vermute da gibt es solche Dinge out-of-the-box :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
geograph
User
Beiträge: 6
Registriert: Freitag 11. Juli 2014, 14:34

Ja, das könnte eine Hilfe sein. Schau ich mir mal bei Gelegenheit an. Danke dir.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Hallo Hyperion,
bei mir sollen vorne und hinten Teile von einer Liste abgeschnitten werden. Hierfür ist Slicing doch das richtige oder?
Die Nummern sehen Beispielsweise so aus,
12341789.321567891.007 (Ist nur ein Beispiel, die richtigen haben andere Ziffern, diese habe ich aber gerade nicht hier)
von der Zeile soll nur 1789.321567 übrig bleiben.
Der Code sieht wie folgt aus,

Code: Alles auswählen

a=open("HALL_GES.txt","r")
b=open("HALL_GESB.txt","w")

for line in a:
    c=line[4:15]
    print(c)
    b.write(c)
            
a.close()
b.close()
Im Python Shell ist auch alles richtig Dargestellt.

Code: Alles auswählen

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
1789.321567
2789.321567
3789.321567
4789.321567
5789.321567
6789.321567
7789.321567
8789.321567
9789.321567
0789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
6789.321567
>>> 
In der Textdatei die neu erzeugt wird, ist alles in in einer Zeile dargestellt.

Code: Alles auswählen

1789.3215672789.3215673789.3215674789.3215675789.3215676789.3215677789.3215678789.3215679789.3215670789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.3215676789.321567
Ich habe leider überhaupt keine Ahnung wie ich dort ein Zeilenumbruch erzwingen kann. Zu Zeilenumbrüchen speziell in for-Schleifen finde ich nichts.

Gruß Kai
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Zeilenumbruch hat nichts mit der Schleife zu tun, darum kannst du da natuerlich auch nichts finden ;)

Das Problem ist, dass du nur diese Zahlen in die Datei schreibst und damit eben keinen Zeilenumbruch, was `print` jedoch implizit hinzufuegt.

Code: Alles auswählen

with open("HALL_GES.txt","r") as a, open("HALL_GESB.txt","w") as b:
    for line in a:
        b.write(line[4:15] + '\n')
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Super, Danke für den Tipp, hat funktioniert !

Gruß Kai
Antworten