2012-04-08 21 views
9

menudo termino de escribir código comoEn Python, ¿qué otras formas de escribir si x == 1 o x == 5 o x == 10 ...?

if x == 1 or x == 5 or x == 10 or x == 22 : 
    pass 

En Inglés parece redundante para seguir repitiendo x, ¿hay una manera más fácil o más corto para escribir una sentencia if-así?

Tal vez la comprobación de la existencia de x 's valor en una tupla (1, 5, 10, 22,) o algo?

+2

Sí, 'si x en [1, 50, 10, 22]' es más fácil de escribir y lea –

Respuesta

14

Sí, tiene razón, ya sea en una tupla o (si esta comprobación se realiza de forma repetida) en un conjunto.

Así que, o hacer

if x in (1, 5, 10, 22): 
    pass 

o, si lo hace esta comprobación frecuencia y el número de valores es lo suficientemente grande,

myset = set((1, 5, 10, 22)) 

[...] 

if x in myset: 
    pass 

El material myset es el más útil, más valores que quiero verificar 4 valores son bastante pocos, por lo que puede mantenerlo simple. 400 valores y debe usar el conjunto ...

Otro aspecto, como señala Marcin, es el hashing necesario para la búsqueda en el conjunto que puede ser más costoso que buscar linealmente una lista o tupla para el valor deseado.

+7

En Python 2.7/3. *, también puede usar un conjunto literal: '{1, 5, 10, 22}'. En Python 3.2+, esto incluso optimiza el uso de un 'frozenset' de forma transparente si solo está haciendo una comprobación' in' (aunque no si está guardando el resultado en una variable). – Dougal

+2

+1 para que el primero sugiera establecer, pero tengo que estar de acuerdo con Dougal en que debes usar la nueva sintaxis si es posible. –

+1

'set ((1, 5, 10, 22))' funciona en más versiones que '{1, 5, 10, 22}' y realmente no es tan legible en mi humilde opinión. – martineau

6

Puede utilizar in con una colección:

if x in [1, 5, 10, 22]: 
    # etc... 

if x in {1, 5, 10, 22}: # New syntax for creating sets 
    # etc... 

Tenga en cuenta que esto creará una nueva lista cada vez que se ejecuta la línea. Si la eficiencia es una preocupación, cree la colección solo una vez y vuelva a usarla.

+0

... o un conjunto, como escribí. No es tan urgente con 4 valores, más urgente con 40, 400 o 4000 ... – glglgl

+0

Sin embargo, una tupla es más común y un conjunto es semánticamente más agradable, incluso descontando los beneficios de rendimiento que tienen (dependiendo de la versión de Python en el último caso) . – delnan

+0

@glglgl: Oh sí, un set es una mejor idea. Tuple se usa comúnmente, pero creo que no es semánticamente el tipo más apropiado. –

2

Si necesitas un buen rendimiento y se va a repetir la misma comparación varias veces, utilizar un conjunto:

s = frozenset([1, 5, 10, 22]) # at the beginning 

if x in s: # in your code 
    pass 
+3

Por supuesto, para pequeños conjuntos de datos, una tupla puede ser más rápida (sin necesidad de hash, estructura de datos más simple, sin riesgo de colisión) y en Python 3.2, obtienes esta optimización gratis (incluso mejor, el frozenset se crea solo una vez) usas un conjunto de literales en la condición. Además, los mismos términos y condiciones que con todos los problemas de rendimiento: (1) Mida si necesita optimizar esto. (2) ¡Haz # 2 otra vez! (3) ¿De verdad? (4) ¡Bien, bien! Obtenga sus elecciones y coteje bien con ellas. – delnan

+0

Entonces, crear un 'frozenset', ¿es más rápido que crear una' lista' regular, y un 'conjunto'? – George