Sortieren einer mehrdimensionalen Liste

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
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Servus,

bin absoluter Python-Anfänger, dennoch im Vergleich zu anderen Sprachen, die ich kenne, ist in Python vieles sehr einfach gehalten ... macht richtig Spaß!

Gut, ich kann keine Listen sortieren, das ist mein Code, ich will gerne nach dem Wert 0,xxx, hier der fünften Spalte absteigend sortieren. Ich las schon, dass sich in Python 3 da wohl was geändert hat, daher bitte ich um ein Beispiel für python3.

Ich weiss auch nicht ob ich das Einlesen korrekt mache, wie macht ihr das, wenn ihr eine CSV-Datei einlesen wollt, diese in den Hauptspeicher überführt, dann sortiert und dann wieder eine neue CSV-Datei schreibt - danke vorab!

Code: Alles auswählen

#!/usr/bin/python3

# Quelldaten datimpcols ... 
# 0;102L_A;120;0;102L_A;0,716668;24;120;163

try:
	d = open( "datimpcols.txt" )
except:
	print( "Oeffnen der Datei nicht erfolgreich!" )
	sys.exit(0)
	
# Lesen
wholecontent = d.read()
d.close()

# Wandle in Datenstruktur
allrows = wholecontent.split( chr(10) )
row = []
i = 0
for row in allrows:
	if row:
		temprowtokens = zeile.split(";")
		row.append( [ i, temprowtokens[4], float( temprowtokens[5]), int( temprowtokens[7] ) ] )
		i = i + 1

# Sortieren der Liste nach U-Wert
sorted( rows, key=lambda row[ ) 

# Schreiben der Datei 
try :
	d = open( "plotdat.txt", "w" )
except:
	print( "Datei kann nicht geoeffnet werden.")
	sys.exit( 0 )
	
for element in li :
	d.write( element[ 2 ] + " " + element[3] + "\n" )
	print( element[ 2 ], " ", element[3], "\n" )

d.close()
			

print( "... Ende!" )


Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ein paar Anmerkungen:

-Es gibt ein csv Modul.
-Dateien sollte man mit with öffnen.

Code: Alles auswählen

with open('myfile.txt') as fobj:
    do what you want
- statt chr(10) kannst du '\n' schreiben
- oder gleich splitlines
- oder direkt readlines
- oder du iterierst über die einzelnen Zeilen:

Code: Alles auswählen

with open('myfile.txt') as fobj:
    for line in fobj:
        ...
Edit:

lambda Ausdrücke sollten so aussehen: key=lambda x: x[5]
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Das ist kein syntaktisch gültiges Python:
Jochen1980 hat geschrieben:

Code: Alles auswählen

sorted( rows, key=lambda row[ )
Auch sonst ist dein Code fehlerhaft bzw. unpythonisch, zB. wird die Variable "li" nirgends initialisiert, und "i = i + 1" ist selten der richtige Weg in Python.
Mach lieber sowas:

Code: Alles auswählen

import csv

with open('datimpcols.txt') as csv_file:
    csv_rows = csv.reader(csv_file, delimiter=';')
    rows = [[i] + fields for i, fields in enumerate(csv_rows)]
    rows.sort(key=lambda fields:float(fields[6]), reverse=True)
In specifications, Murphy's Law supersedes Ohm's.
Jochen1980
User
Beiträge: 40
Registriert: Montag 15. August 2011, 18:44

Danke soweit, wie gesagt ich bin Einsteiger, mein Einsteigerbuch ist von Theis 'Einstieg in Python', das Sortieren stammt da nich draus aber das chr10 etc. Aber generell ist das Buch schon brauchbar hoffe ich. Also dann versuche ich es mal mit dem csv-Paket.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Brauchbar ist auf jeden Fall das Tutorial. Siehe Signatur.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten