El operador in responde una pregunta frecuente: ¿este valor pertenece a esta colección? Funciona con strings, listas, tuplas, sets, diccionarios, rangos, generadores y objetos personalizados. Aunque la sintaxis es sencilla, su significado y rendimiento dependen del objeto que se busca.
En esta guía aprenderás el operador in en Python, not in, el comportamiento de los diccionarios, búsquedas de substrings, pertenencia eficiente en sets, consumo de iteradores y clases con __contains__.
Pruebas básicas
colores = ["rojo", "verde", "azul"]
print("verde" in colores) # True
print("amarillo" not in colores) # TrueEl resultado es booleano y puede utilizarse directamente en una condición.
roles_permitidos = {"admin", "editor", "lector"}
rol = "editor"
if rol in roles_permitidos:
print("Rol reconocido")
else:
print("Rol desconocido")Pertenencia en strings
Con strings, in busca una substring, no solamente un carácter. La comprobación distingue mayúsculas y minúsculas.
mensaje = "Python facilita la automatización"
print("automatización" in mensaje) # True
print("Automatización" in mensaje) # False
print("thon" in mensaje) # TruePara una búsqueda que ignore mayúsculas, normaliza ambos valores con casefold().
mensaje = "Python Facilita la Automatización"
consulta = "AUTOMATIZACIÓN"
encontrado = consulta.casefold() in mensaje.casefold()La guía de strings en Python explica otros métodos de limpieza, búsqueda y comparación.
Listas y tuplas
En una lista o tupla, Python compara elementos desde el principio hasta encontrar un valor igual o llegar al final.
coordenadas = (10, 20, 30)
numeros = [2, 4, 6, 8]
print(20 in coordenadas)
print(5 in numeros)Para repasar creación y modificación de listas, consulta listas en Python.
Sets para búsquedas repetidas
Los sets están diseñados para valores únicos y pruebas de pertenencia eficientes. Convertir una lista tiene un coste, pero puede compensar cuando realizas muchas búsquedas.
usuarios_bloqueados = {"sam", "lee", "alex"}
usuario = "lee"
if usuario in usuarios_bloqueados:
print("Solicitud rechazada")Utiliza una lista cuando el orden y los duplicados sean importantes; utiliza un set cuando la pertenencia y la unicidad sean centrales. La guía de sets en Python explica unión, intersección y diferencia.
Los diccionarios comprueban claves
En un diccionario, in busca claves por defecto, no valores ni pares completos.
usuario = {
"nombre": "Maya",
"correo": "[email protected]",
"activo": True,
}
print("correo" in usuario) # True
print("Maya" in usuario) # False
print("Maya" in usuario.values()) # True
print(("nombre", "Maya") in usuario.items()) # TrueLa guía de diccionarios en Python muestra claves, valores y pares.
Rangos
La pertenencia en range es eficiente porque Python puede calcular si un número cumple el inicio, el fin y el paso.
pares = range(0, 1_000_000, 2)
print(500_000 in pares)
print(500_001 in pares)Los iteradores se consumen
Ten cuidado con generadores y otros iteradores de una sola pasada. La búsqueda avanza por los valores y puede consumir parte o todo el objeto.
numeros = (numero for numero in range(5))
print(2 in numeros) # consume 0, 1 y 2
print(list(numeros)) # quedan 3 y 4Si el valor no existe, el iterador puede quedar agotado completamente.
Validar con not in
comandos_validos = {"iniciar", "detener", "estado"}
comando = input("Comando: ").strip().lower()
if comando not in comandos_validos:
print("Comando inválido")
else:
print(f"Ejecutando {comando}")not in resulta útil en guard clauses y validaciones tempranas.
def establecer_prioridad(prioridad):
permitidas = {"baja", "media", "alta"}
if prioridad not in permitidas:
raise ValueError(
f"Prioridad desconocida: {prioridad}"
)
return prioridadComprobar varias claves obligatorias
datos = {
"nombre": "Maya",
"correo": "[email protected]",
"activo": True,
}
obligatorias = {"nombre", "correo"}
if obligatorias <= datos.keys():
print("Datos completos")También puedes usar all():
if all(clave in datos for clave in obligatorias):
print("Datos completos")Buscar dentro de estructuras anidadas
La pertenencia no es recursiva. Para buscar un campo dentro de una lista de diccionarios, escribe la condición explícitamente.
usuarios = [
{"id": 1, "correo": "[email protected]"},
{"id": 2, "correo": "[email protected]"},
]
objetivo = "[email protected]"
existe = any(
usuario["correo"] == objetivo
for usuario in usuarios
)
print(existe)La expresión generadora evita crear una lista temporal. La guía de list comprehensions en Python explica transformaciones y filtros relacionados.
Personalizar con __contains__
class RangoTemperatura:
def __init__(self, minimo, maximo):
self.minimo = minimo
self.maximo = maximo
def __contains__(self, valor):
return self.minimo <= valor <= self.maximo
confortable = RangoTemperatura(18.0, 25.0)
print(22.5 in confortable)
print(30.0 in confortable)Una implementación personalizada debe ser predecible y no debería modificar el estado ni realizar solicitudes remotas.
in no es igual a is
is comprueba identidad de objetos. in comprueba pertenencia y normalmente utiliza igualdad.
elementos = [1, 2, 3]
misma_referencia = elementos
otra_lista = [1, 2, 3]
print(elementos is misma_referencia) # True
print(elementos is otra_lista) # False
print(2 in elementos) # TrueErrores frecuentes
- Esperar que un diccionario busque valores en lugar de claves.
- Olvidar que las búsquedas de strings distinguen mayúsculas.
- Usar una lista para miles de búsquedas repetidas cuando conviene un set.
- Consumir un generador y esperar que conserve todos los elementos.
- Suponer que la búsqueda entra automáticamente en estructuras anidadas.
- Confundir pertenencia, igualdad e identidad.
Conclusión
El operador in en Python es pequeño pero muy versátil. Comprende qué considera miembro cada objeto, utiliza sets y diccionarios para búsquedas frecuentes, normaliza texto de forma deliberada y recuerda que los iteradores pueden consumirse.
Documentación oficial
La referencia del lenguaje explica las pruebas de pertenencia con in y not in. La documentación de tipos integrados detalla cómo se comportan strings, secuencias, sets, rangos y diccionarios.






