eleganterer Vergleich zweier integer-Zahlen mit cmp ?

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
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

liebe Python-Gurus,
habe eine etwas behäbige Lösung für folgendes Problem und suche eine elegantere Lösung (Einzeiler?).

Problem: 2 integerzahlen a und b sind gegeben, ich möchte dazwischen
ein "<", ">" oder ein "=" Zeichen setzten, je nachdem ob a kleiner, größer oder gleich b ist.

meine Lösung:

Code: Alles auswählen

def pfeil(a,b):
    if a == b:
        return "="
    elif a > b:
        return ">"
    else:
        return "<"
        
a = 80
b = 70
z = pfeil(a,b)
print("%i %s %i" % (a, z, b))
Frage: geht das auch eleganter, z.B. direkt in der Print Zeile ?

vielen Dank im Voraus !
http://spielend-programmieren.at
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

HorstJENS hat geschrieben:liebe Python-Gurus,
habe eine etwas behäbige Lösung für folgendes Problem und suche eine elegantere Lösung (Einzeiler?).

Problem: 2 integerzahlen a und b sind gegeben, ich möchte dazwischen
ein "<", ">" oder ein "=" Zeichen setzten, je nachdem ob a kleiner, größer oder gleich b ist.

meine Lösung:

Code: Alles auswählen

def pfeil(a,b):
    if a == b:
        return "="
    elif a > b:
        return ">"
    else:
        return "<"
        
a = 80
b = 70
z = pfeil(a,b)
print("%i %s %i" % (a, z, b))
Frage: geht das auch eleganter, z.B. direkt in der Print Zeile ?

vielen Dank im Voraus !
ungetestet:

Code: Alles auswählen

z = "=><"[(a > b) - (a < b)]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

"<=>"[cmp(a, b)+1]
Ich finde die erste Lösung aber gar nicht so verkehrt, da sieht man wenigstens sofort was gemeint ist.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

def compare(a, b):
    operators = {-1: '<', 0: '=', 1: '>'}
    return operators[cmp(a, b)]
elegant != das Kürzeste ;) (imho)
Zuletzt geändert von snafu am Freitag 9. Oktober 2009, 20:25, insgesamt 1-mal geändert.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

EyDu hat geschrieben:

Code: Alles auswählen

"<=>"[cmp(a, b)+1]
Weil der OP print() als Funktion benutzt, gehe ich davon aus, dass er Python 3.x benutzt. Da gibt es cmp() nicht mehr.
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

bords0 hat geschrieben:Weil der OP print() als Funktion benutzt, gehe ich davon aus, dass er Python 3.x benutzt. Da gibt es cmp() nicht mehr.
Ich habe das Beispiel mit Python2.6 gemacht, die Klammern bei print da ich demnächst umstellen will auf Python3.x

Danke für die tollen Lösungen !
http://spielend-programmieren.at
BlackJack

@HorstJENS: Deswegen sollte man IMHO aber keine unnötigen Klammern setzen, die a) verwirren, und b) nur funktionieren, wenn man keine "Ausgabeliste" mit Kommas hinter dem Schlüsselwort ``print`` hat. ``print`` sollte problemlos von 2to3.py in die neue Syntax umgesetzt werden können.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

EyDu hat geschrieben:

Code: Alles auswählen

"<=>"[cmp(a, b)+1]
Das geht noch noch kürzer ;)

Code: Alles auswählen

"=><"[cmp(a, b)]
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

Das geht noch noch kürzer ;)

Code: Alles auswählen

"=><"[cmp(a, b)]
genial
http://spielend-programmieren.at
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

HorstJENS hat geschrieben:
Das geht noch noch kürzer ;)

Code: Alles auswählen

"=><"[cmp(a, b)]
genial
Das ist das die gleiche Lösung wie in der allerersten Antwort, bis auf den Einsatz von cmp - wenn du aber sogar print umstellst (und die unterschiedliche Semantik in 2.6/3.x in Kauf nimmst!), willst du doch auch kein cmp mehr...
Antworten