Seite 1 von 2

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

Verfasst: Donnerstag 14. Juni 2007, 17:33
von trimber
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

Verfasst: Donnerstag 14. Juni 2007, 17:40
von BlackJack
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.

Verfasst: Donnerstag 14. Juni 2007, 17:47
von trimber
Oh...
Dass macht Sinn.
Vielen Dank für die schnelle Antwort.

Verfasst: Donnerstag 14. Juni 2007, 20:39
von Michael Schneider
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

Verfasst: Donnerstag 14. Juni 2007, 21:35
von birkenfeld
Neeiiiin!

Code: Alles auswählen

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

Verfasst: Donnerstag 14. Juni 2007, 21:55
von mitsuhiko
birkenfeld hat geschrieben:DAS ist elegant.
und schnell :)

Verfasst: Freitag 15. Juni 2007, 06:37
von Michael Schneider
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

Verfasst: Freitag 15. Juni 2007, 11:59
von birkenfeld
Urgh, 2.2... *shudder* ;)

Verfasst: Freitag 15. Juni 2007, 18:00
von Leonidas
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.

Verfasst: Freitag 15. Juni 2007, 21:53
von Michael Schneider
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

Verfasst: Freitag 15. Juni 2007, 22:29
von thelittlebug
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

Verfasst: Freitag 15. Juni 2007, 22:40
von Sr4l
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 :-)

Verfasst: Freitag 15. Juni 2007, 22:43
von birkenfeld
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...

Verfasst: Freitag 15. Juni 2007, 23:04
von pyStyler
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.

Verfasst: Freitag 15. Juni 2007, 23:09
von Sr4l
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?

Verfasst: Samstag 16. Juni 2007, 07:20
von birkenfeld
Sr4l hat geschrieben:
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 :-)
Naja, 2.5.1 ist draußen.
Wo wir schon bei dem Thema sind kann ich schon eine Blick auf Python3 Alpha werfen?
Mit SVN: http://svn.python.org/projects/python/branches/p3yk

Verfasst: Samstag 16. Juni 2007, 09:57
von Michael Schneider
Moin!
Sr4l hat geschrieben:Power8 ? Powerade? PowerRaid?
Ja, gute Frage, das Letzte trifft es wohl am besten. Wenn man die Nachrichten vor wenigen Wochen verfolgt hat, sollte einem dieser Terminus bekannt sein. ;-) Das hat was mit den 8 Teilprogrammen zutun, aus denen es sich zusammensetzt. Aber um das Gegenteil von dem auszudrücken, was es gegenwärtig macht, würde ich es vielleicht MPower nennen.

Ich wollte nur sagen, dass man bei allen Elegantheitsverbesserungsvorschlägen auch angeben sollte, ab wann man sie einsetzen kann, jedenfalls wenn die neue Form erst in den letzten 1 oder zwei Teilversionen eingeführt wurde. Der Vorschlag oben mit "key=int" ist freilich eleganter, aber nur dann, wenn man mindestens 2.4 verwendet. Das pauschal zu behaupten finde ich falsch, denn mein Vorschlag hat ebenfalls Sinn und seine Existenzberechtigung - zumindest bis 2.4.

Grüße,
Michael

Verfasst: Samstag 16. Juni 2007, 10:07
von Sr4l
birkenfeld hat geschrieben:
Sr4l hat geschrieben:
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 :-)
Naja, 2.5.1 ist draußen.
Wo wir schon bei dem Thema sind kann ich schon eine Blick auf Python3 Alpha werfen?
Mit SVN: http://svn.python.org/projects/python/branches/p3yk
Danke bei 2.5 zähle ich das .1 nicht mit bei 2.3.5 irgend wie schon :-)
Die Zahl scheint mir zu klein zu sein um sie erwähnenswert zu finden.

Danke für den py3k link habe da schon einmal gesucht gehabt aber nicht gefunden, muss gesethen habe die PEPs auch nur sporadisch gelesen.

Verfasst: Samstag 16. Juni 2007, 14:51
von birkenfeld
Michael Schneider hat geschrieben:Der Vorschlag oben mit "key=int" ist freilich eleganter, aber nur dann, wenn man mindestens 2.4 verwendet. Das pauschal zu behaupten finde ich falsch, denn mein Vorschlag hat ebenfalls Sinn und seine Existenzberechtigung - zumindest bis 2.4.
Zumindest hier im Forum werde ich nicht der Vergangenheit nachhängen, sondern moderne und effiziente Python-Programmierung betreiben. Dazu gehört auch, mindestens 2.4 vorauszusetzen. 2.4 ist seit 2 1/2 Jahren draußen, 2.3 sogar seit ca. 4 Jahren.

Verfasst: Samstag 16. Juni 2007, 18:08
von Michael Schneider
Hallo Birkenfeld!
birkenfeld hat geschrieben:Zumindest hier im Forum werde ich nicht der Vergangenheit nachhängen, sondern moderne und effiziente Python-Programmierung betreiben. Dazu gehört auch, mindestens 2.4 vorauszusetzen. 2.4 ist seit 2 1/2 Jahren draußen
Als Beta vielleicht, das ist nicht der Zeitpunkt, wo ich mich für einen Umstieg entscheiden würde.

Nichtsdestotrotz glaube ich, in meinem letzten Beitrag hierzu alles gesagt zu haben: es geht mir nicht darum, alten Zeiten nachzuhängen. Sondern lediglich darum, bei Verbesserungsvorschlägen, die auf neueren Features basieren als die vorhandenen Vorschläge, auch zu erwähnen, ab wann man diese einsetzen kann. Denn es ist FALSCH, generell zu behaupten, dass eine Lösung eleganter ist, wenn sie nicht ebenso generell möglich ist. Ich bleibe bei meiner Einstellung dazu, ob Du sie teilst oder nicht.

Grüße,
Michael