Problem bei Trennung eines Arrays

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
gecko9922
User
Beiträge: 1
Registriert: Donnerstag 4. März 2010, 14:15

Hallo ich bin ein Neuling in Sache Programmieren und Python und hoffe ihr koennt mir vielleicht weiterhelfen. Also das Problem ist dies. Ich habe ein kleines Skript geschrieben.

Hier mal der relevante Teil davon

Code: Alles auswählen

import os
import sys

#Ordner suchen
home=os.getcwd()
tmplist=os.listdir(home)
tmplist.sort()
tmplistnumber=len(tmplist)
for i in range(0,tmplistnumber):
   if tmplist[i][0]=='c':
      try:
        input_POSCAR=open(tmplist[i]+"/POSCAR","r")
      except IOError:
        print tmplist[i]+"/POSCAR konnte nicht geoeffnet werden"
      else:
 #POSCAR wird eingelesen
        line_POSCAR=input_POSCAR.readlines()
#Auslesen der Atomanzahl aus POSCAR
        structure=line_POSCAR[5]
        print(structure)
der Output (also structure) dann zum Beispiel so aus:

Code: Alles auswählen

    0    0    16

    0    1    15

    0    8    8

    0    16   0
bei tmplistnumber=1 natuerlich so

Code: Alles auswählen

  0    0    16
So meine Frage ist jetzt die:
Wie kann ich die Werte die in den einzelnen Spalten, stehen getrennt in jeweils eine Variable schreiben? Ich moechte also bei jedem Durchlaufen der loop, 3 Variablen generieren die die den drei Spalten entsprechen, die ich dann weiterverwenden kann.

Ich weiss nicht wie schwer das zu machen ist. Ich hoffe ihr glaubt nicht dass ich nur zu faul bin dies selbst zu machen ich hab naemlich schon stundenlang im Internet danach gesucht bin aber nicht fuendig geworden.

Danke schon mal
Zuletzt geändert von gecko9922 am Donnerstag 4. März 2010, 15:01, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Setz das mal in Python-Code-Tags, sonst kann man das nicht gut entziffern.

Das da ist zumindest schon mal eine Kombination die erstens zeigt, dass du erstens höchstwahrscheinlich schon in anderen Sprachen programmiert hast und zweitens noch nicht lange mit Python arbeitest:

Code: Alles auswählen

tmplistnumber=len(tmplist)
for i in range(0,tmplistnumber):
    if tmplist[i][0]=='c': 
In Python gibt es für diesen Zweck eine schöne andere Konstruktion:

Code: Alles auswählen

for entry in tmplist:
    if entry[0]=='c': 
Weiter wollte ich dann wegen fehlender Einrückung nicht lesen.


Zum Problem als solches: Es sieht so aus, als hättest du einen String den du anhand der Leerzeichen als Trenner in Einzelteile zerlegen möchtest. Dafür findet sich in der Dokumentation zu Strings ganz sicher eine passende Methode - und das ohne eine Suchmaschine zu bemühen.
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

Code: Alles auswählen

tmplist = ' '.split(string)
list = []
for element in tmplist:
    if element != '':
        list.append(int(element))
So in der Art sollte es funktionieren (habs jetzt nich ausprobiert).
Zuerst teilst du deinen String in eine Liste aus Strings auf, wobei als Trennzeichen das Leerzeichen verwendet wird, anschließend übernimmst du alle nichtleeren Elemente in deine endgültige Liste, welche dann die einzelnen Zahlen als Integer enthält.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Trichter hat geschrieben:So in der Art sollte es funktionieren (habs jetzt nich ausprobiert).
Merkt man. Überleg mal was du mit dieser Zeile

Code: Alles auswählen

tmplist = ' '.split(string)
eigentlich machst.


Was du machen willst ist Folgendes:

Code: Alles auswählen

tmplist = stringvalue.split()
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

/me hat geschrieben: Was du machen willst ist Folgendes:

Code: Alles auswählen

tmplist = stringvalue.split()
Stimmt ja. join war das wo man das Trennzeichen vorne ranstellt.

Code: Alles auswählen

tmplist = string.split(' ')
list = []
for element in tmplist:
    if element != '':
        list.append(int(element))
Aber so müsste es doch gehen. Gibt es eigentlich noch eine bessere Methode die leeren strings aus der Liste zu entfernen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Trichter hat geschrieben:Gibt es eigentlich noch eine bessere Methode die leeren strings aus der Liste zu entfernen?

Code: Alles auswählen

>>> filter(bool, ["spam", "", "eggs"])
['spam', 'eggs']
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Trichter hat geschrieben:

Code: Alles auswählen

tmplist = string.split(' ')
list = []
for element in tmplist:
    if element != '':
        list.append(int(element))
Aber so müsste es doch gehen. Gibt es eigentlich noch eine bessere Methode die leeren strings aus der Liste zu entfernen?
Ich weiß nicht was du mit deinem Code da eigentlich anstellen willst. Es ist auch mehr als unglücklich, mit Variablennamen wie list die Builtins von Python zu überschreiben.

Das Problem das du da offensichtlich zu lösen versuchst existiert gar nicht. In der Liste kommen gar keine Leerstrings vor.

Code: Alles auswählen

foo = " 1  23   42   "
bar = foo.split()
print bar

['1', '23', '42']
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:

Code: Alles auswählen

>>> filter(bool, ["spam", "", "eggs"])
['spam', 'eggs']
Oder so:

Code: Alles auswählen

>>> filter(None, ["spam", "", "eggs"])
['spam', 'eggs']
Trichter
User
Beiträge: 45
Registriert: Montag 20. April 2009, 10:21

Wieder was gelernt. Ich wusste gar nicht das Python ohne Angabe eines Trennzeichens leere Elemente gar nicht erst in die Liste aufnimmt. Gibt man nämlich ein Trennzeichen an, werden definitiv leere strings in die Liste aufgenommen.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Außer mab gibt None als Argument mit

Code: Alles auswählen

>>> foo = " 1  23   42   \nas\rd"
>>> foo.split()
['1', '23', '42', 'as', 'd']
>>> foo.split(None)
['1', '23', '42', 'as', 'd']
>>> 
the more they change the more they stay the same
Antworten