Seite 1 von 1

eleganterer Vergleich zweier integer-Zahlen mit cmp ?

Verfasst: Freitag 9. Oktober 2009, 19:45
von HorstJENS
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 !

Re: eleganterer Vergleich zweier integer-Zahlen mit cmp ?

Verfasst: Freitag 9. Oktober 2009, 19:51
von bords0
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)]

Verfasst: Freitag 9. Oktober 2009, 19:58
von EyDu

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.

Verfasst: Freitag 9. Oktober 2009, 20:23
von snafu

Code: Alles auswählen

def compare(a, b):
    operators = {-1: '<', 0: '=', 1: '>'}
    return operators[cmp(a, b)]
elegant != das Kürzeste ;) (imho)

Verfasst: Freitag 9. Oktober 2009, 20:24
von bords0
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.

Verfasst: Samstag 10. Oktober 2009, 10:05
von HorstJENS
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 !

Verfasst: Samstag 10. Oktober 2009, 14:06
von 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.

Verfasst: Samstag 10. Oktober 2009, 14:48
von Defnull
EyDu hat geschrieben:

Code: Alles auswählen

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

Code: Alles auswählen

"=><"[cmp(a, b)]

Verfasst: Samstag 10. Oktober 2009, 15:43
von HorstJENS
Das geht noch noch kürzer ;)

Code: Alles auswählen

"=><"[cmp(a, b)]
genial

Verfasst: Samstag 10. Oktober 2009, 19:31
von bords0
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...