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!
Löschen bestimmter Bereiche im String
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.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.
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]]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- 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
assert encoding_kapiert
- 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
assert encoding_kapiert
-
- 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,
Im Python Shell ist auch alles richtig Dargestellt.
In der Textdatei die neu erzeugt wird, ist alles in in einer Zeile dargestellt.
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
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()
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
>>>
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
Gruß Kai
- 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.
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')
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 104
- Registriert: Mittwoch 24. Juni 2015, 14:12
- Wohnort: Bochum
Super, Danke für den Tipp, hat funktioniert !
Gruß Kai
Gruß Kai