Seite 1 von 1

Problem bei Trennung eines Arrays

Verfasst: Donnerstag 4. März 2010, 14:46
von gecko9922
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

Re: Problem bei Trennung eines Arrays

Verfasst: Donnerstag 4. März 2010, 14:55
von /me
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.

Verfasst: Donnerstag 4. März 2010, 15:21
von Trichter

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.

Verfasst: Donnerstag 4. März 2010, 15:28
von /me
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()

Verfasst: Donnerstag 4. März 2010, 15:34
von Trichter
/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?

Verfasst: Donnerstag 4. März 2010, 15:41
von EyDu
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']

Verfasst: Donnerstag 4. März 2010, 15:42
von /me
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']

Verfasst: Donnerstag 4. März 2010, 15:48
von numerix
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']

Verfasst: Donnerstag 4. März 2010, 15:55
von Trichter
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.

Verfasst: Donnerstag 4. März 2010, 16:00
von Dav1d
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']
>>>