[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

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

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

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

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

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/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

birkenfeld hat geschrieben:DAS ist elegant.
und schnell :)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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

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

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

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:

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

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

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:

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?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten