Je veux utiliser l'algèbre booléenne au lieu de plusieurs conditions, par exemple

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

Ce que je veux faire c'est

def simple(x,y):
    return x#y

Et il y a un total de 12 équations, je veux juste retourner directement (x # y) où # est un opérateur booléen. Je l'ai fait pour un problème plus petit où j'ai heureusement découvert une relation. Je veux faire la même chose dans ce cas également, comment dois-je procéder?

Cela a-t-il des gains de performances, parce que cela ne passe pas par plusieurs conditions? Est-ce une pratique normale?

Échantillon:

 x    y   output
 1    2     3
 1    3     2
 1    4     5
 1    5     4

Ici une simple porte xor au niveau du bit fera l'affaire

def(x,y): return x^y
0
syllogismos 18 déc. 2011 à 03:35

3 réponses

Meilleure réponse

Je ne sais pas si essayer de trouver une expression terser de la logique ci-dessus conduirait à un code plus lisible; probablement pas. Mais vous pouvez retravailler la logique telle quelle pour une formulation plus mathématique:

def boo(x, y):
    p = (x, y)
    return (1 if p in ((3, 4), (4, 2)) else
            2 if p == (4, 1) else
            3 if p == (5, 1) else
            4 if p == (3, 1) else
            None)

Une autre option consiste à utiliser un dictionnaire:

def boo(x, y):
    return {(3,4):1, (4,2):1, (4,1):2, (5,1):3, (3,1):4}.get((x, y), None)

Si vous savez que toutes les valeurs correspondront aux cas spécifiés, vous pouvez écrire [(x, y)] au lieu de .get((x, y), None).

1
Marcelo Cantos 17 déc. 2011 à 23:56

Vous pouvez trouver la bonne expression qui donne les mêmes valeurs que vos conditions, mais un tel code devient plus difficile à lire et à maintenir.

Une meilleure solution consiste à utiliser une liste ou un dictionnaire imbriqué que vous pouvez indexer avec des valeurs d'entrée. De cette façon, vous transformez le code en données qui sont une représentation claire et rapide de votre cartographie et qui peuvent être facilement comprises et facilement modifiées à l'avenir.

2
Adam Zalcman 17 déc. 2011 à 23:43

Vous pourriez envisager d'utiliser des dictionnaires. Vous pouvez peut-être créer un dictionnaire de dictionnaires et demander à votre fonction de récupérer des valeurs via le dictionnaire.

def boo(x,y):
    if x==3 and y==1: return 4
    if x==3 and y==4: return 1
    if x==4 and y==1: return 2
    if x==4 and y==2: return 1
    if x==5 and y==1: return 3

def boodict(x,y):
    d1 = {3: {1:4, 4:1} ,4: {1:2, 2:1},5: {1:3}}
    try:
        value = d1[x][y]
    except KeyError:
        value = None
    return value
0
zallarak 18 déc. 2011 à 00:22