2010-07-15 19 views
16

tengo un s variable que contiene una cadena de una letracómo comprobar variable con 2 valores posibles pitón

s = 'a' 

Dependiendo del valor de esa variable, quiero volver las cosas diferentes. Hasta ahora estoy haciendo algo similar a esto:

if s == 'a' or s == 'b': 
    return 1 
elif s == 'c' or s == 'd': 
    return 2 
else: 
    return 3 

¿Existe alguna forma mejor de escribir esto? una forma más pythonic? ¿O es este el más eficiente?

Anteriormente, he tenido incorrectamente algo como esto:

if s == 'a' or 'b': 
    ... 

Obviamente eso no funciona y era bastante tonto de mí.

sé de asignación condicional y han intentado esto:

return 1 if s == 'a' or s == 'b' ... 

Creo que mi pregunta es específicamente para ¿hay alguna manera se puede comparar una variable de dos valores sin tener que escribir 'algo == O algo algo == algo '

+0

pregunta : ¿qué estás haciendo con este código? ¿Estás cambiando las opciones de la línea de comandos, porque si lo haces deberías mirar el módulo 'getopt' en su lugar. –

Respuesta

30
if s in ('a', 'b'): 
    return 1 
elif s in ('c', 'd'): 
    return 2 
else: 
    return 3 
+0

wow tan simple. gracias – pythonrubies

+2

@pythonrubies - si esto es lo que estabas buscando, acéptalo como la respuesta. @Jesse: recomendaría utilizar tuplas en lugar de listas para su fragmento de código. –

+0

Pregunta rápida, ¿hay alguna diferencia entre la respuesta de @Jesse Dhillon y @Tim Pietzcker? – pythonrubies

1

Si solo devuelve valores fijos, un diccionario es probablemente el mejor enfoque.

1
if s in 'ab': 
    return 1 
elif s in 'cd': 
    return 2 
else: 
    return 3 
+0

Como señaló @Jesse Dillon, esto solo funciona con cadenas, y también devolvería 1 si 's == 'ab'', pero las restricciones de la pregunta eran específicas sobre esto -' s' es una cadena de una letra . –

+0

Correcto, no diría que esto es incorrecto dados los parámetros de la pregunta. +1 por demostrar que '__contains__' es un predicado para probar la existencia de subcadenas dentro de cadenas. –

12
d = {'a':1, 'b':1, 'c':2, 'd':2} 
return d.get(s, 3) 
+0

Yo diría que esto es bastante inteligente. –

+0

Ahora tengo curiosidad si esto es más rápido. – pythonrubies

+1

Incluso podría reducirse aún más: 'return {'a': 1, 'b': 1, 'c': 2, 'd': 2} .get (s, 3)' –

1

Tal vez poco más autodocumentado de usar si otra cosa:

d = {'a':1, 'b':1, 'c':2, 'd':2} ## good choice is to replace case with dict when possible 
return d[s] if s in d else 3 

También es posible aplicar la popular primera respuesta con si otra cosa:

return (1 if s in ('a', 'b') else (2 if s in ('c','d') else 3)) 
1
return 1 if (x in 'ab') else 2 if (x in 'cd') else 3 
+0

esto permitiría 'x' ser '' ab'' o ''cd'' – SilentGhost

+0

@SilentGhost: la intención es resolver el problema propuesto, no una variante, OP dijo" Tengo una variable s que contiene una cadena de una letra " –

+0

Poner' ab ' y 'cd' como list ('ab') y list ('cd'), entonces x no puede ser la combinación 'ab' y 'cd'. –

Cuestiones relacionadas