¿Cómo comprobar la variable contra 2 valores posibles?

Tengo una variable s que contiene una cadena de una letra

s = 'a' 

Dependiendo del valor de esa variable, quiero devolver cosas diferentes. Hasta ahora estoy haciendo algo como esto:

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

¿Hay una mejor manera de escribir esto? ¿Una forma más pythonica? ¿O es este el más eficiente?

Anteriormente, incorrectamente tuve algo como esto:

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

Obviamente eso no funciona y fue bastante tonto de mi parte.

Sé de asignación condicional y he intentado esto:

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

Supongo que mi pregunta es específicamente si existe una forma de comparar una variable con dos valores sin tener que escribir something == something or something == something

 if s in ('a', 'b'): return 1 elif s in ('c', 'd'): return 2 else: return 3 
  d = {'a':1, 'b':1, 'c':2, 'd':2} return d.get(s, 3) 

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

 if s in 'ab': return 1 elif s in 'cd': return 2 else: return 3 
 return 1 if (x in 'ab') else 2 if (x in 'cd') else 3 

Tal vez un poco más de auto-documentación utilizando 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 implementar la primera respuesta popular con si:

  return (1 if s in ('a', 'b') else (2 if s in ('c','d') else 3))