Seite 1 von 1
Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 09:40
von burli
Hi, wenn ich das richtig sehe ist das Ergebnis von glob.glob() eine Liste. Ich suche mit
glob.glob('/dev/ttyS*') nach vorhandenen seriellen Schnittstellen und erhalte auch eine Liste
['/dev/ttyS3', '/dev/ttyS2', '/dev/ttyS1', '/dev/ttyS0']
Allerdings schaffe ich es nicht, diese Liste zu sortieren. Hier ein kurzes Testprogramm
Code: Alles auswählen
import sys
import serial
import glob
def scan():
"""scan for available ports. return a list of device names."""
return glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')
comports = scan()
print comports
comports = comports.sort()
print comports
Das Ergebnis:
Code: Alles auswählen
['/dev/ttyS3', '/dev/ttyS2', '/dev/ttyS1', '/dev/ttyS0']
None
Ich habe alle Varianten durch, aber ich stehe auf dem Schlauch.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 09:41
von sma
sort() sortiert die Liste, auf die es angewendet wird und liefert NICHT eine neue sortierte Liste zurück.
Stefan
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 09:51
von burli
hm, aber müsste dann scan().sort() nicht auch funktionieren?
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 09:56
von snafu
Code: Alles auswählen
def scan():
return sorted(glob('/dev/ttyS*') + glob('/dev/ttyUSB*'))
`sorted()` liefert eine sortierte Liste zurück, während `list.sort()`, die Liste, wie schon erwähnt wurde in-place sortiert und nichts zurückliefert.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 09:58
von snafu
burli hat geschrieben:hm, aber müsste dann scan().sort() nicht auch funktionieren?
Das funktioniert sicherlich. In deinem Beispiel bindest du jedoch des Ergebnis der Sortierung (`None`) an `comports` und überschreibst damit die alte Liste. Folglich siehst du quasi kein Ergebnis.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 10:03
von burli
Die eigentliche Zeile lautet
und ich wollte eigentlich daraus
machen. Also den Rückgabewert von scan() sortieren bevor er an addItems() übergeben wird.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 10:07
von Dav1d
Wie schon erwähnt, du musst sorted nehmen.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 10:26
von burli
Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?
Schonmal danke für die Antworten
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 10:58
von EyDu
burli hat geschrieben:Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?
Nein, du darfst nur nicht den Rückgabewert von sort verwenden. Der ist immer None.
Code: Alles auswählen
spam = scan()
spam.sort()
self.comComport.addItems(spam)
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 11:10
von jbs
Nein.
Code: Alles auswählen
foo = [1,3,6,2,3,1,0]
print 'sortiere foo', foo.sort()
print foo
Inplace bedeutet, dass die Liste verändert wird und der Rückgabewert dieser Funktion ist None.
Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 11:12
von burli
Ok, danke, ich denk ich hab es verstanden. Jetzt muss ich es mir nur noch merken

Re: Kann Ergebnis von glob.glob() nicht sortieren
Verfasst: Samstag 7. August 2010, 12:07
von snafu
burli hat geschrieben:Ok, also sort() kann nur direkt auf eine Liste angewendet werden. scan() selbst ist keine Liste, daher funktioniert es nicht. Soweit richtig verstanden?
`scan()` ist sehr wohl ein Aufruf, der hier eine Liste zurückliefert. Lediglich `scan` als Name bildet die Funktion ab. Und bekanntlich spielt für die Weiterverarbeitung nur das, was am Ende irgendwo herausgekommen ist, eine Rolle, nicht der Weg, wie etwas zustande gekommen ist.