Compact manière d'écrire (a + b == c ou a + c == b ou b + c == a)

Est-il plus compact ou pythonic façon d'écrire l'expression booléenne

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

Je suis venu avec

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

mais c'est un peu étrange.

  • a + b + c == max(a, b, c) ne serait pas True à moins que les deux plus petites valeurs de la somme à 0.
  • Plus compact? Peut-être. Plus Pythonic? Peu probable.
  • Il semble que vous avez trois mutuellement exclusifs conditions - c'est sans doute pourquoi vous êtes or-ing eux. Semble que si il sont mutuellement exclusifs, vous ne seriez pas en mesure de les combiner et d'en simplifier l'expression.
  • Faites votre future auto une faveur et de les garder dans la forme originale: C'est la seule qui indique immédiatement le but de cette. Ne pas le modifier. “Simple est mieux que d'être compliqué.”, “La lisibilité compte.”. “Si la mise en œuvre est difficile à expliquer, c'est une mauvaise idée.”
  • Pythonic == illisible?
  • Pas un python personne mais n'a pas de python ont quelques frais de la liste des fonctions? Je voudrais essayer de la liste de toutes les permutations de [a,b,c] et de trouver un endroit où le dernier est la somme des autres, ou quelque chose comme ça.
  • Peut-être il peut être plus pythonic si vous dites d'abord dans la langue, ce que cette comparaison de la cible.
  • Ils ne sont pas mutuellement exclusives. Voir a = 0, b = 0, c = 0 😉
  • J'aime ce que vous est venu avec le meilleur.
  • Ce que @phresnel dit. Au lieu d'essayer de "simplifier" l'expression, de l'envelopper dans une fonction avec un nom descriptif.
  • Sinon, affecter la valeur de la comparaison d'une variable avec un nom descriptif. Dépend, quoi de plus logique 🙂
  • J'ai lu une fois que vous devriez écrire votre code source, comme si elle sera maintenue par un fou armé d'une hache plus tard. Je pense que le fou armé d'une hache préférez votre première version. Et @Alex Varga besoin de regarder par-dessus son épaule pour le fou armé d'une hache!
  • est (0,0,0) le seul trio qui sera True pour les trois conditions?
  • Oui, le problème peut être vu comme un système homogène d'équations linéaires et comme il y a 3 variables et 3 de l'indépendance linéaire des équations (en d'autres termes de la matrice est de plein rang), la seule solution qui satisfait à tous les trois est (0,0,0). Si vous avez besoin seulement 2 conditions sont remplies en même temps, il y aurait une infinité de solutions reposant sur une seule ligne dans 3D carthesian de l'espace. En changeant les conditions, vous obtiendrez 3 lignes que tous se coupent en (0,0,0)
  • Attention. Si a, b, c sont des nombres à virgule flottante, puis a + b == c or a + c == b or b + c == a n'est pas équivalent à a + b + c in (2*a, 2*b, 2*c), en général. Par exemple, avec a = 1 + 2*sys.float_info.epsilon, b = 1, et c = 2, l'expression est évaluée à False, tandis que le second évalue à True.

InformationsquelleAutor qwr | 2015-08-19