Simplifique la comparación encadenada


254

Tengo un valor entero x, y tengo que comprobar si está entre una starty endvalores, así que escribir las siguientes afirmaciones:

if x >= start and x <= end:
    # do stuff

Esta declaración se subraya, y la información sobre herramientas me dice que debo

simplificar la comparación encadenada

Por lo que puedo decir, esa comparación es tan simple como parece. ¿Qué me he perdido aquí?


1
Si recibe una sugerencia de la información sobre herramientas, puede pasar el mouse sobre el área y le dará una pequeña bombilla. Puede hacer clic en él y hacer que inserte automáticamente el cambio que sugiere. Para que pueda ver lo que cree que debería estar haciendo (y puede deshacer si no le gusta).
— Edward Ned Harvey

Respuestas:


432

En Python puedes "encadenar" las operaciones de comparación, lo que significa que están "y" juntas. En su caso, sería así:

if start <= x <= end:

Referencia: https://docs.python.org/3/reference/expressions.html#comparisons


2
Gracias, no sabía que podías hacer eso en Python. Realmente me estaba rascando la cabeza en este caso.
— Brynn McCullagh

18
Hombre, así es como deberían ser las cosas. Pero viniendo de otros idiomas, olvidas tus ideales y ni siquiera piensas, que las cosas podrían ser como deberían ser. Pero es por eso que Python es increíble, exactamente por esas cosas :)
— Hakaishin

¿Conoces alguna fuente "oficial" que recomiende el estilo encadenado sobre el otro? ¿Cuál es más Python "idiomático"?
— Ray

No sé, a veces desearía que Python arrojara más barandas. x == y == z falla con un ValueError cuando x, y, z son series Pandas
— BallpointBen

@BallpointBen: muchas cosas no funcionan como cabría esperar en Pandas, ni siquiera x == y and y == z.
— John Zwinck

12

Se puede reescribir como:

start <= x <= end:

O:

r = range(start, end + 1) # (!) if integers
if x in r:
    ....

55
El rango es una mala elección porque para un inicio y fin grandes está creando una lista innecesaria.
— Burhan Khalid

1
@BurhanKhalid De hecho, pero creo que vale la pena mencionarlo para OP.
— Maroun

77
En python3, el rango maneja " contiene " muy bien, por lo que no se genera ninguna lista.
— JoshNahum

2
@MarounMaroun desde python 3, la función de rango se comporta como el anterior xrange, también vale la pena mencionarlo
— dvdvck

55
Para obtener detalles sobre el uso de if x in range(...), consulte " ¿Por qué" 1000000000000000 en el rango (1000000000000001) "es tan rápido en Python 3? ".
— Kevin J. Chase

-4

Simplificación del código.

if start <= x <= end: # start x is between start and end 
# do stuff

99
¿Cómo es esto diferente de esta respuesta?
— GWigWam
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.