Kann Ergebnis von glob.glob() nicht sortieren

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
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

sort() sortiert die Liste, auf die es angewendet wird und liefert NICHT eine neue sortierte Liste zurück.

Stefan
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

hm, aber müsste dann scan().sort() nicht auch funktionieren?
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Die eigentliche Zeile lautet

Code: Alles auswählen

self.comComport.addItems(scan())
und ich wollte eigentlich daraus

Code: Alles auswählen

self.comComport.addItems(scan().sort())
machen. Also den Rückgabewert von scan() sortieren bevor er an addItems() übergeben wird.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wie schon erwähnt, du musst sorted nehmen.

Code: Alles auswählen

self.comComport.addItems(sorted(scan()))
the more they change the more they stay the same
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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)
Das Leben ist wie ein Tennisball.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[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]
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ok, danke, ich denk ich hab es verstanden. Jetzt muss ich es mir nur noch merken :)
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten