2009-02-06 27 views
1

J'essaie de comprendre lambdas et je reçois l'idée, mais comment puis-je définir plusieurs conditions pour une Point2 [x, y] comparaison, donc quelque chose comme:Fonction de comparaison en Python en utilisant lambdas

if x1 < x2: -1 
if x1 == x2: 0 
if x1 > x2: 1 
+0

-1: passer du temps à "comprendre" lambdas. Ils sont "def" épelé drôle. –

Répondre

3

EDIT: Mise à jour pour être vrai Python selon PEP308 :) Notez que le PEP a des informations intéressantes sur la façon dont cela devrait être entre parenthèses en fonction de la version de Python que vous utilisez. Je ne vais pas essayer de le reproduire ici - il suffit de lire le PEP!

Que diriez-vous:

-1 if x1 < x2 else (0 if x1 == x2 else 1) 

(C'est sans aucune connaissance des expressions lambda Python, mais il est un moyen assez commun d'exprimer cette logique en une seule expression, que je suppose est ce que vous êtes après.)

EDIT: D'autres ont suggéré d'utiliser cmp - J'ai supposé que le questionneur veut réellement une logique plus compliquée, comme fournir leurs propres comparaisons, mais veut la forme générale de "choisir parmi quelques conditions dans une seule expression" .

+0

Merci Jon. J'ai été surpris de vous voir répondre à une question python mais je savais que vous auriez une grande connaissance de C# :) –

+0

ce n'est pas valide python –

+0

Doh - regardé une page Python, mais il donnait un exemple de PHP. Aargh. Essayer de faire trop de choses à la fois. –

5

Le code ci-dessus est équivalente à:

cmp(x1,x2) 

ou dans un (laid) expression lambda:

lambda x1,x2: 1 if x1>x2 else (0 if x1==x2 else -1) 

(ne fonctionne que dans le python 2.6 et au-dessus).

Normalement, vous devez utiliser des expressions lambda que pour des fonctions comme

def fun(...): 
    return ... 
+0

Quand vous dites: si x1> x2 que rentre-t-il? Cela va juste à autre chose? –

+0

1 si x1> x2 else (0 si x1 == x2 else -1) est l'équivalent en python de Javas: x1> x2? 1: (x1 == x2? 0: -1). Et oui il essaie x1> x2 si c'est faux, il prend la valeur après sinon, si vrai il prend la valeur avant le il (1 dans ce cas) –

+0

De PEP 308, il semblerait que cela fonctionnera en Python 2.5 si vous mettre des crochets dans: "lambda x1, x2: (1 si x1> x2 sinon (0 si x1 == x2 sinon -1))" - mais je ne peux pas facilement tester cela. –

4
my_compare = lambda x1,x2 : cmp(x1, x2) 
my_compare(-100, 100) 
+0

Good one codelogic. –

+0

my_compare = cmp; my_compare (-100, 100) – Ken

+0

Mieux encore, juste: cmp (-100, 100) Le code était purement pour démontrer l'utilisation de lamda. – codelogic

4

Dans un tel cas, les expressions lambda ne sont généralement pas la meilleure chose. Comme Jon Skeet mentionné, vous êtes fin va avec plusieurs if-else expressions:

lambda x1, x2: -1 if x1 < x2 else (0 if x1 == x2 else -1) 

Pour votre problème spécifique:

lambda x1, x2: cmp(x1, x2) 

est le chemin à parcourir.

Questions connexes