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.