Suchen und extrahieren aus Listen

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
Julia_py
User
Beiträge: 2
Registriert: Samstag 24. November 2012, 16:20

Hallo,

bin noch nicht so Python bewandert, habe aber einige Tutorials durchgemacht aber kann mein Problem nicht lösen:
Ich habe in einer ASCII Datei i Zeilen Koordinaten gegeben und in der ersten Spalte den fortlaufenden Index i dazu:
Nach der Koordinatenliste kommen Gruppierungsanweisungen mit den Indices E versehen mit den Indices i der Koordinaten wobei die Anzahl beliebig ist.
So eine ASCII Datei schaut z.B. so aus:

--
1 x1 y1 z1
2 x2 y2 z2
3 x3 y3 z3
4 x4 y4 z4
5 x5 y5 z5
..
..
E 1 2 3 5
E 1 4
E 2 3 5
..
..
--

Wie kann ich nun jeweils die Koordinaten x y z aus der Koordinatenliste enstprechend der Gruppierungsanweisung extrahieren?
Ich kann zwar Koordinatenlisten einlesen, jede Spalte in eine Liste abspeichern aber z.B. die Suchfunktion für Listen ist mir noch ein Mysterium.

Für Unterstützung wär ich sehr froh! :D

Julia
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Julia

was hast Du bisher gemacht?
Es hilft uns sehr, wenn wir auf Deine bisherige Einleseroutine aufbauen können.
An welcher konkreten Stelle kommst Du dann nicht weiter?

Grüße
Sirius
Julia_py
User
Beiträge: 2
Registriert: Samstag 24. November 2012, 16:20

Bis jetzt hab ich nur das Einlesen der Koordinaten und der Indices jeweils in Listen gemacht und das funktioniert.

--

Code: Alles auswählen

Input_file = 'coord.txt'
file = open(Input_file, 'r')
input = file.readlines()
file.close()
l_i = []
l_x = []
l_y = []
l_z = []
for lines in input:
    input = lines.split()
    if 'E' in lines:
        break
    l_i.append(int(input[0]))
    l_x.append(float(input[1]))
    l_y.append(float(input[2]))
    l_z.append(float(input[3]))
print l_i
--

Ich müsste jetzt die Zeilen mit E beginnend einlesen (als Listen?) und weiters wie im ersten Posting beschrieben, die den entsprechenden Indices die Koordinaten zuweisen.

Schöne Güße,
Julia
Zuletzt geändert von Anonymous am Samstag 24. November 2012, 18:02, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Julia_py: Als erstes solltest Du nicht die *Spalten* in einzelne Listen einlesen, sondern eine Liste mit Zeileninformationen erstellen, wo die einzelnen Elemente Listen mit den Werten der Zeile sind. Denn diese Werte gehören ja zusammen, also sollte man sie auch zusammen in einer Datenstruktur speichern. Denn später möchtest Du ja auf alle drei Werte einer Koordinate zugreifen. Das ist einfacher wenn man das mit einem Zugriff auf eine Liste machen kann statt mit drei Zugriffen auf drei Listen.

Wenn der Index tatsächlich in Einerschritten steigt, und vielleicht sogar noch grundsätzlich mit 0 oder mit 1 beginnt, dann braucht man den 1. nicht Speichern und 2. stellt sich die Frage nach dem ”suchen” dann nicht. Denn dann *weiss* man ja an welchem Index in der Liste sich die gesuchte Koordinate befindet.

Sollten sich die Werte in der ersten Spalte nicht so nett verhalten, dann ist eine Liste eher die falsche Datenstruktur und man möchte die Koordinaten lieber in ein Wörterbuch einlesen, das den Index auf die drei Werte der Koordinate abbildet. ”Suchen” ist dann auch wieder trivial.

Setze Quelltexte in Zukunft bitte in Code-Tags, damit die Einrückung in der Anzeige nicht verloren geht. Die ist bei Python ja wichtig zum Verständnis des Quelltextes.
BlackJack

Ungetestet, unter der Annahme, dass die Indizes in den Dateien immer mit 1 beginnen und in Einerschritten steigen:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from pprint import pprint


def main():
    coordinates = list()
    groups = list()
    with open('coord.txt') as lines:
        for line in lines:
            if line.startswith('E '):
                indices = map(int, line[1:].split())
                assert all(0 < i <= len(coordinates) for i in indices)
                groups.append([coordinates[i - 1] for i in indices])
            else:
                parts = line.split()
                assert len(parts) == 4 and int(parts[0]) == len(coordinates) + 1
                coordinates.append(map(float, parts[1:]))
    
    pprint(coordinates)
    pprint(groups)


if __name__ == '__main__':
    main()
Ausserdem erlaubt der Code Koordinaten- und Gruppen-Zeilen zu mischen, damit ich mir die Implementierung von Zuständen ersparen kann. Die ``asserts`` sind erst einmal vorläufig zur Fehlersuche drin, um zu sehen ob die Annahmen über die Daten in der Datei stimmen. Das ist in Ordnung zum Entwickeln und wenn man das ganze nur selbst auf selbst erzeugten Daten anwendet, aber wenn die Daten von Benutzern kommen, sollte man sie durch eine ordentliche Fehlerbehandlung ersetzen. Denn über Benutzerdaten sollte man keine Annahmen treffen. :-)
Antworten