136 votes

Compact une + b == c ou a + c == b ou b + c == un

Y a-t-il une manière plus compacte ou Pythonique d’écrire l’expression booléenne

Je suis venu avec

mais c’est un peu étrange.

205voto

Barry Points 45207

Si l'on regarde le Zen de Python, c'est moi qui souligne:

Le Zen de Python, par Tim Peters

La belle est mieux que laid.
Explicite est mieux qu'implicites.
Simple est mieux que complexe.
Complexe est mieux que compliqué.
L'appartement est mieux que imbriqués.
Incomplet est mieux que dense.
La lisibilité des comptes.
Cas particuliers ne sont pas assez spécial pour briser les règles.
Bien que le côté pratique battements de pureté.
Les erreurs ne doivent jamais passer sous silence.
Sauf si explicitement réduits au silence.
Dans le visage de l'ambiguïté, de refuser la tentation de le deviner.
Il devrait y avoir un, et de préférence seulement une façon évidente de le faire.
Bien que cette façon peut-être pas évident à première vue, sauf si vous êtes en néerlandais.
Est maintenant mieux que jamais.
Bien que jamais est souvent mieux que la droite maintenant.
Si la mise en œuvre est difficile à expliquer, c'est une mauvaise idée.
Si la mise en œuvre est facile à expliquer, il peut être une bonne idée.
Les espaces de noms sont un coup de klaxon grande idée, nous allons faire plus de ceux-là!

La plupart des Pythonic solution est celle qui est la plus claire, la plus simple et la plus facile à expliquer:

a + b == c or a + c == b or b + c == a

Mieux encore, vous n'avez même pas besoin de savoir Python pour comprendre ce code! C'est que facile. C'est, sans réserve, la meilleure solution. Tout le reste est de la masturbation intellectuelle.

En outre, c'est probablement la solution la plus performante, car il est le seul de toutes les propositions que les courts-circuits. Si a + b == c, une seule addition et la comparaison est effectuée.

101voto

Alex Varga Points 440

Résoudre les trois égalités pour a:

54voto

Mark Ransom Points 132545

Python a une fonction qui fait un sur tous les éléments d’une séquence. Ici j’ai converti votre déclaration en un tuple de 3 éléments.

Notez que `` est un court-circuit, donc si le calcul des conditions individuelles est cher il serait peut-être préférable de garder votre construction originale.

40voto

Cyphase Points 741

Si vous savez que vous avez seulement à faire avec des nombres positifs, cela fonctionne, et il est assez propre:

a, b, c = sorted((a, b, c))
if a + b == c:
    do_stuff()

Comme je l'ai dit, cela ne fonctionne que pour les nombres positifs; mais si vous savez qu'ils vont être positif, c'est très lisible solution de l'OMI, même directement dans le code plutôt que dans une fonction.

Vous pourriez faire, ce qui pourrait faire un peu de calcul répété; mais vous ne spécifiez pas les performances de votre objectif:

from itertools import permutations

if any(x + y == z for x, y, z in permutations((a, b, c), 3)):
    do_stuff()

Ou sans permutations() et la possibilité de la répétition des calculs:

if any(x + y == z for x, y, z in [(a, b, c), (a, c, b), (b, c, a)]:
    do_stuff()

Je serais probablement mis, ou toute autre solution, dans une fonction. Ensuite, vous pouvez simplement et proprement appeler la fonction dans votre code.

Personnellement sauf à ce que j'avais besoin de plus de souplesse dans le code, je voudrais juste utiliser la première méthode dans votre question. C'est simple et efficace. Je peux toujours le mettre dans une fonction:

def two_add_to_third(a, b, c):
    return a + b == c or a + c == b or b + c == a

if two_add_to_third(a, b, c):
    do_stuff()

C'est assez Pythonic, et c'est très probablement le moyen le plus efficace de le faire (l'extra appel de fonction à part); bien que vous ne devriez pas trop vous inquiéter au sujet de la performance de toute façon, à moins que c'est en fait à l'origine d'un problème.

17voto

ThatGuyRussell Points 107

Si vous allez seulement à l'aide de trois variables, alors votre initiale de la méthode:

a + b == c or a + c == b or b + c == a

Est déjà très pythonic.

Si vous prévoyez sur l'utilisation de plusieurs variables, alors la méthode de votre raisonnement avec:

a + b + c in (2*a, 2*b, 2*c)

Est très intelligent, mais permet de réfléchir à la raison. Pourquoi ce travail?
Bien au travers de quelques arithmétiques simples, nous voyons que:

a + b = c
c = c
a + b + c == c + c == 2*c
a + b + c == 2*c

Et ce sera le cas, soit a,b, ou c, ce qui signifie que oui, il sera égal à 2*, 2*b, ou 2*c. Ce sera vrai pour un nombre quelconque de variables.

Donc, un bon moyen d'écrire rapidement ce serait tout simplement avoir une liste de vos variables et vérifier leur somme par rapport à une liste de l'doublé valeurs.

values = [a,b,c,d,e,...]
sum(values) in [2*x for x in values]

De cette façon, pour ajouter plus de variables dans l'équation, tout ce que vous avez à faire est de modifier votre liste de valeurs par des 'n' de nouvelles variables, de ne pas écrire " n " équations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X