[GELÖST] - List.sort() funktioniert nur unzuverlässig

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.
trimber
User
Beiträge: 2
Registriert: Donnerstag 14. Juni 2007, 16:15

[GELÖST] - List.sort() funktioniert nur unzuverlässig

Beitragvon trimber » Donnerstag 14. Juni 2007, 17:33

Hallo allerseits,

ich habe meine ersten Python Schritte erst vor einigen Tagen unternommen und bin jetzt auf ein Problem gestoßen dass ich nicht ganz begreife.
Mein Ziel war es ein Program zu schreiben, dass drei numerische Werte von der Kommandozeile einliest, diese Werte der Größe nach ordnet und dann den mittleren Wert ausgibt.
Dazu schrieb ich den folgenden Code:

Code: Alles auswählen

a = raw_input('one: ')
b = raw_input('two: ')
c = raw_input('three: ')

aa = [0,1,2]
aa[0] = a
aa[1] = b
aa[2] = c

aa.sort(cmp)
print aa[1]

Mit den Eingangswerten 9, 3, 6 gibt dass Program z.B. die Zahl 6 aus.
Funktioniert also wunderbar.
Wenn ich allerdings die folgenden Werte benutze: 10, 5, 8 gibt dass Program die Zahl 5 aus.
Ich verstehe dass ganze nur soweit, dass es immer dann ein solches Problem gibt, wenn einer der Werte mehr Stellen hat als die anderen Werte. 10 hat zwei Stellen, während 5 und 8 nur jeweils eine Stelle haben.
Ich benutze Python 2.5 von www.python.org.
Ich würde mich freuen wenn mir jemand weiterhelfen könnte.

Gruss,

trimber
Zuletzt geändert von trimber am Donnerstag 14. Juni 2007, 17:48, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Donnerstag 14. Juni 2007, 17:40

Die *Zeichenkette* '10' ist lexikographisch kleiner als die *Zeichenkette* '5'. Wenn Du nach dem numerischen Wert sortieren willst, solltest Du auch *Zahlen* vergleichen/sortieren.

Code: Alles auswählen

In [13]: '10' < '5'
Out[13]: True

In [14]: 10 < 5
Out[14]: False


`list.sort()` funktioniert also zuverlässig.

Die `cmp()`-Funktion brauchst Du übrigens nicht bei `sort()` angeben, das produziert nur unnötige zusätzliche Funktionsaufrufe.
trimber
User
Beiträge: 2
Registriert: Donnerstag 14. Juni 2007, 16:15

Beitragvon trimber » Donnerstag 14. Juni 2007, 17:47

Oh...
Dass macht Sinn.
Vielen Dank für die schnelle Antwort.
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Donnerstag 14. Juni 2007, 20:39

Hallo,

es ist natürlich effizienter, die Werte einmal umzuwandel statt bei jedem Vergleich, aber wenn die Performance nicht ganz so wichtig ist, sieht eine eigene Vergleichsfunktion auch recht elegant aus, finde ich:

Code: Alles auswählen

l = ["5", "10", "6", "70"]
string_number_sort = lambda a,b:cmp(int(a),int(b))
l.sort(string_number_sort)
print l

liefert:
['5', '6', '10', '70']

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Donnerstag 14. Juni 2007, 21:35

Neeiiiin!

Code: Alles auswählen

l = ["5", "10", "6", "70"]
l.sort(key=int)
print l

DAS ist elegant.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Donnerstag 14. Juni 2007, 21:55

birkenfeld hat geschrieben:DAS ist elegant.

und schnell :)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Freitag 15. Juni 2007, 06:37

birkenfeld hat geschrieben:Neeiiiin!

Code: Alles auswählen

l = ["5", "10", "6", "70"]
l.sort(key=int)
print l

DAS ist elegant.

Hi Birkenfeld!

Das ist vielleicht elegantER, funzt aber nicht mit meiner Version 2.2 :P

Python Library Reference hat geschrieben:Changed in version 2.4: Support for key and reverse was added.

Wenn man die prerequesites außen vor lässt hast Du natürlich recht. :wink:

Grüße,
Sky
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 15. Juni 2007, 11:59

Urgh, 2.2... *shudder* ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 15. Juni 2007, 18:00

Michael Schneider hat geschrieben:Das ist vielleicht elegantER, funzt aber nicht mit meiner Version 2.2 :P

Jo und in den Versionen vor 1.5 fehlen auch viele Dinge. Ist nur die Frage, wie lange man an den alten Versionen hängenbleiben will/muss. Zumal die neuen in der Hinsicht eigentlich auch keine Nachteile haben, sogar die Performance ist besser.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Freitag 15. Juni 2007, 21:53

Hi,

wie schonmal anderweitig erwähnt bin ich betriebsseitig an 2.2 gebunden und mein Unternehmen hat (jedenfalls vor 'Power8') allein in Deutschland > 10000 Mitarbeiter. Da kann ich nicht einfach mal zur IV-Koordinatorin gehen und sagen, sie solle mal über ein upgrade nachdenken...
Jedenfalls habe ich nicht zufällig diese Version erwähnt, sondern weil ich mir in mancherlei Hinsicht Workarounds einfallen lassen muss. Übrigens weiß man die eingebaute Methode sorted() erst dann zu schätzen, wenn man sie nicht hat (wie viele andere aber auch). :-)

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
thelittlebug
User
Beiträge: 187
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Beitragvon thelittlebug » Freitag 15. Juni 2007, 22:29

Michael Schneider hat geschrieben:Übrigens weiß man die eingebaute Methode sorted() erst dann zu schätzen, wenn man sie nicht hat


hmm... Endlich hab ich ein Anwendungsgebiet für das von Gerold angesprochene XML-RPC entdeckt :D
Sollte gehen ;)

lgherby
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Freitag 15. Juni 2007, 22:40

Power8 ? Powerade? PowerRaid?

Vorschlagen kann man es ja schon einmal auf eine neue Version upzudaten :-)
Was daraus wird ist etwas anderes.

Ich mache es immer so ich teste einfach die neue Version mit meinem Projekt und schau was ich für Warnungen o.ä bekommen dann weiß ich auf wieviel Arbeit ich mich einstellen muss und entscheide es dann.
Python 2.3.5 zu 2.4.1 habe ich gemacht. Bei 2.5 habe ich mit ein paar Sachen Probleme und lasse erstmal die nächste Version erscheine :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 15. Juni 2007, 22:43

Sr4l hat geschrieben:Python 2.3.5 zu 2.4.1 habe ich gemacht. Bei 2.5 habe ich mit ein paar Sachen Probleme und lasse erstmal die nächste Version erscheine :-)


Das ist schon passiert...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Freitag 15. Juni 2007, 23:04

Michael Schneider hat geschrieben:Hi,

wie schonmal anderweitig erwähnt bin ich betriebsseitig an 2.2 gebunden und mein Unternehmen hat (jedenfalls vor 'Power8') allein in Deutschland > 10000 Mitarbeiter. Da kann ich nicht einfach mal zur IV-Koordinatorin gehen..... l

wieso nicht? Vereinzelt machen die Admins das schon. Wenn ich mit deine Firma richtig liege.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Freitag 15. Juni 2007, 23:09

birkenfeld hat geschrieben:Das ist schon passiert...


Die Alpha1 Phase hat begonnen mehr nicht? Wenn ich jetzt irgend wie daneben liege bitte eine ganz genaue Erklärung oder Link :-)
Oder unterschätze ich die Alpha1 Phase ist da schon größten Teils alles gemacht?

Wo wir schon bei dem Thema sind kann ich schon eine Blick auf Python3 Alpha werfen?

Wer ist online?

Mitglieder in diesem Forum: mollyman