El operador in es eloperador de membresía de Python que verifica si un valor existe en una colección como una lista, tupla, cadena, conjunto o diccionario. Devuelve True si se encuentra el valor y False en caso contrario. Este operador hace que las pruebas de membresía sean limpias y legibles.
¿Qué hace el operador in?
El operador in realiza unaprueba de membresía: busca un valor dado dentro de una colección y devuelve un resultado booleano. La sintaxis básica es:
value in collection Aquí, value es lo que estás buscando, y collection puede ser cualquier objeto iterable como una lista, tupla, cadena, conjunto o diccionario (para diccionarios, in verifica las claves por defecto).
Usar in con listas y tuplas
Las listas y tuplas son los casos de uso más comunes para el operador in.
Ejemplo 1: Verificar membresía en listas
numbers = [1, 2, 3, 4, 5]
print(3 in numbers) # Output: True
print(10 in numbers) # Output: False
print(3 not in numbers) # Output: False True False False
Ejemplo 2: Verificar membresía en tuplas
coordinates = (10, 20, 30)
print(20 in coordinates) # Output: True
print(50 in coordinates) # Output: False
print(50 not in coordinates) # Output: True True False True
Para listas y tuplas, Python usa unalgoritmo de búsqueda lineal, lo que significa que verifica cada elemento uno por uno hasta encontrar una coincidencia o llegar al final. La complejidad temporal es O(n), por lo que las colecciones más grandes tardan más en buscar.
Usar in con cadenas
Cuando se usa con cadenas, el operador in verifica lamembresía de subcadena.
Ejemplo 1: Verificación básica de subcadena
text = "Hello, World!"
print("World" in text) # Output: True
print("Python" in text) # Output: False
print("hello" in text) # Output: False (case-sensitive) True False False
Ejemplo 2: Verificación sin distinción entre mayúsculas y minúsculas
text = "Hello, World!"
search = "world"
print(search.lower() in text.lower()) # Output: True True
Las pruebas de membresía de cadenas distinguen entre mayúsculas y minúsculas. Si necesitas verificaciones sin distinción entre mayúsculas y minúsculas, convierte ambas cadenas al mismo caso. Las búsquedas de subcadenas en cadenas de Python también tienen complejidad O(n) en el peor caso.
Usar in con conjuntos
Los conjuntos están optimizados para pruebas de membresía. Debido a que los conjuntos usantablas hash internamente, el operador in tiene una complejidad temporal promedio de O(1).
Ejemplo 1: Verificación rápida de membresía
allowed_users = {"alice", "bob", "charlie"}
print("alice" in allowed_users) # Output: True
print("dave" in allowed_users) # Output: False True False
Ejemplo 2: Optimización de rendimiento
# Slow for large lists
users = ["alice", "bob", "charlie"]
if "alice" in users:
print("Found")
# Fast - convert to set first
users_set = set(users)
if "alice" in users_set:
print("Found") Found Found
Si necesitas realizar muchas verificaciones de membresía, convertir primero una lista a un conjunto puede mejorar dramáticamente el rendimiento.
Usar in con diccionarios
Cuando usas in con un diccionario, verifica si existe una clave (no valores).
Ejemplo 1: Verificar claves
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
print("alice" in user_ages) # Output: True
print("dave" in user_ages) # Output: False
print(30 in user_ages) # Output: False (30 is a value, not a key) True False False
Ejemplo 2: Verificar valores
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
# Check if a value exists
print(30 in user_ages.values()) # Output: True True
Ejemplo 3: Verificar pares clave-valor
user_ages = {"alice": 30, "bob": 25, "charlie": 35}
# Check if a key-value pair exists
print(("alice", 30) in user_ages.items()) # Output: True True
Las pruebas de membresía de diccionarios para claves también son O(1) en promedio porque los diccionarios usan tablas hash.
El operador not in
Python también proporciona el operador not in, que devuelve True si el valorno se encuentra.
Ejemplo: Usar not in
numbers = [1, 2, 3, 4, 5]
print(10 not in numbers) # Output: True
print(3 not in numbers) # Output: False True False
Esto es simplemente la negación lógica de in, y funciona con todos los mismos tipos de datos.
Usar in con objetos personalizados
Si creas tus propias clases, puedes hacer que funcionen con el operador in implementando el método __contains__().
Ejemplo: Clase de colección personalizada
class MyCollection:
def __init__(self, items):
self.items = items
def __contains__(self, item):
return item in self.items
my_list = MyCollection([1, 2, 3, 4, 5])
print(3 in my_list) # Output: True
print(10 in my_list) # Output: False True False
Si tu clase no define __contains__() pero es iterable (implementa __iter__()), Python recurrirá a iterar a través de la colección para verificar la membresía.
Consideraciones de rendimiento
El rendimiento del operador in depende del tipo de datos.
| Tipo de Datos | Complejidad Temporal | Notas |
|---|---|---|
| List | O(n) | Linear search |
| Tuple | O(n) | Linear search |
| String | O(n) | Substring search |
| Set | O(1) average | Hash-based lookup |
| Dictionary | O(1) average | Hash-based lookup (keys only) |
Para verificaciones frecuentes de membresía en colecciones grandes, prefiere conjuntos o diccionarios sobre listas o tuplas.
Casos de uso comunes
Caso de uso 1: Verificar permisos de usuario
admin_users = {"alice", "bob"}
if current_user in admin_users:
print("Access granted")
else:
print("Access denied") Access granted
Caso de uso 2: Validar entrada
valid_options = ["yes", "no", "maybe"]
user_input = input("Enter your choice: ")
if user_input in valid_options:
print("Valid choice")
else:
print("Invalid choice") Valid choice
Caso de uso 3: Filtrar datos
exclude_words = {"the", "is", "at", "which", "on"}
words = ["the", "quick", "brown", "fox"]
filtered = [word for word in words if word not in exclude_words]
print(filtered) # Output: ['quick', 'brown', 'fox'] ['quick', 'brown', 'fox']
Errores comunes y mejores prácticas
Error 1: Usar in para verificaciones de rango
# Not recommended for performance-critical code
if 5 in range(1, 10):
print("In range")
# Better: Use comparison operators
if 1 <= 5 < 10:
print("In range") No uses in para verificaciones de rango numérico como if 5 in range(1, 10): en código crítico para el rendimiento; usa operadores de comparación en su lugar: if 1 <= 5 < 10:.
Práctica 1: Convertir listas a conjuntos para verificaciones frecuentes
# When checking membership in large lists repeatedly
large_list = [1, 2, 3, ...] # Many items
# Convert to set for faster lookups
large_set = set(large_list)
if item in large_set:
print("Found") Al verificar la membresía en listas grandes repetidamente, convierte primero la lista a un conjunto para búsquedas mucho más rápidas.
Práctica 2: Recordar el comportamiento del diccionario
user_data = {"name": "Alice", "age": 30}
# in checks keys, not values
print("name" in user_data) # True
print("Alice" in user_data) # False
# To check values, use .values()
print("Alice" in user_data.values()) # True Recuerda que in verifica lasclaves en diccionarios, no los valores. Usa .values() o .items() si necesitas verificar valores o pares clave-valor.
Práctica 3: Sensibilidad a mayúsculas y minúsculas en cadenas
text = "Hello, World!"
# Case-sensitive check
print("hello" in text) # False
# Case-insensitive check
print("hello".lower() in text.lower()) # True Las pruebas de membresía de cadenas con in distinguen entre mayúsculas y minúsculas; normaliza el caso si es necesario.
Pruébalo tú mismo
Practica lo que has aprendido modificando el código a continuación. ¡Intenta cambiar los valores y condiciones para ver diferentes salidas!
// Haz clic en "Ejecutar Código" para ver resultados
Temas relacionados
Preguntas frecuentes
¿Cuál es la diferencia entre 'in' y '==' en Python?
El operador in verifica si un valor existe en una colección (prueba de membresía), mientras que == verifica si dos valores son iguales. Por ejemplo, 3 in [1, 2, 3] devuelve True (membresía), mientras que [1, 2, 3] == [1, 2, 3] devuelve True (igualdad).
¿'in' verifica claves o valores en diccionarios?
El operador in verifica lasclaves en diccionarios por defecto. Para verificar valores, usa value in dict.values(). Para verificar pares clave-valor, usa (key, value) in dict.items().
¿'in' distingue entre mayúsculas y minúsculas al verificar cadenas?
Sí, el operador in distingue entre mayúsculas y minúsculas al verificar cadenas. "hello" in "Hello, World!" devuelve False. Para verificaciones sin distinción entre mayúsculas y minúsculas, convierte ambas cadenas al mismo caso: "hello".lower() in "Hello, World!".lower().
¿Cuál es la diferencia de rendimiento entre verificar 'in' en una lista vs un conjunto?
Verificar la membresía en una lista tiene complejidad temporal O(n) (búsqueda lineal), mientras que verificar en un conjunto tiene complejidad temporal promedio O(1) (búsqueda basada en hash). Para verificaciones frecuentes de membresía en colecciones grandes, usa conjuntos para mejor rendimiento.
¿Puedo usar 'in' con clases personalizadas?
Sí, puedes hacer que las clases personalizadas funcionen con el operador in implementando el método __contains__(). Si tu clase es iterable (implementa __iter__()), Python recurrirá a la iteración si __contains__() no está definido.
¿Cuál es la diferencia entre 'in' y 'not in'?
El operador in devuelve True si se encuentra un valor en una colección, mientras que not in devuelve True si un valorno se encuentra. not in es equivalente a not (value in collection).