Secuencias e indices
Las secuencias son estructuras de datos ordenadas que permiten acceder a sus elementos mediante un índice. Este índice puede ser positivo (de izquierda a derecha) o negativo (de derecha a izquierda).
Ejemplo:
texto = "abcd"
# Indices positivos: 0, 1, 2, 3
# Indices negativos: -4, -3, -2, -1
Operación de slicing
La sintaxis básica es [inicio:fin:paso]. El valor en la posición fin no se incluye en el reslutado. Un paso negativo invierte la dirección del recorrido.
cadena = "abcde"
print(cadena[::1]) # abcde
print(cadena[1:4:]) # bcd
print(cadena[0:4]) # abcd
print(cadena[::-1]) # edcba (inversión completa)
print(cadena[-1:-9:-1]) # edcba
Funciones auxiliares
len(secuencia): obtiene la longitud.max(secuencia): devuelve el valor máximo.min(secuencia): devuelve el valor mínimo.secuencia.index(elemento): retorna la primera posición donde aparece el elemento; si no existe, genera un error.
print("*" * 30)
Listas
Creación y características
Son secuencias mutables; al modificar su contenido, la dirección de memoria no cambia. Aceptan métodos como index y count.
# Creación directa
lista_a = ["a", "asd", 12]
# Mediante el constructor list()
lista_b = list(secuencia)
datos = ["123", 123, "abv"]
print(datos.count("abv")) # 1
print(datos.index(123)) # 1
Operaciones principales
Eliminación con del
lista1 = [12, 123, 777]
del lista1
# print(lista1) # Esto lanzará un error porque la lista ya no existe
Recorrido
Con for directo:
elementos = ["abc", "def", "qwe", "123", 555]
for item in elementos:
print(item)
Con range e índice:
for i in range(len(elementos)):
print(elementos[i])
Inserción al final: append vs extend
datos = ["abc", "def", "qwe", "123", 555]
# append agrega el argumento como un único elemento
datos.append(["asd", 123])
datos.append("mmm")
print(datos) # ['abc', 'def', 'qwe', '123', 555, ['asd', 123], 'mmm']
# extend descompone el argumento iterable y agrega sus elementos uno a uno
datos2 = ["abc", "def", "qwe", "123", 555]
datos2.extend("kjh")
print(datos2) # ['abc', 'def', 'qwe', '123', 555, 'k', 'j', 'h']
datos2.extend(["aaa", "bbb"])
print(datos2) # ['abc', 'def', 'qwe', '123', 555, 'k', 'j', 'h', 'aaa', 'bbb']
datos2.extend({"k": "123"}) # En un diccionario, se agregan las claves
print(datos2) # ... 'k'
Inserción en posición específica: insert
valores = ["abc", "def", "qwe", "123", 555]
valores.insert(1, "123")
print(valores) # ['abc', '123', 'def', 'qwe', '123', 555]
Elimianción por valor: remove
colores = ["rojo", "verde", "azul"]
colores.remove("verde")
print(colores) # ['rojo', 'azul']
Eliminación por índice: pop
colores = ["rojo", "verde", "azul"]
eliminado = colores.pop(1)
print(eliminado) # verde
print(colores) # ['rojo', 'azul']
Vaciar lista: clear
lista_borrar = [1, 2, 3]
lista_borrar.clear()
print(lista_borrar) # []
Invertir orden: reverse
numeros = [1, 2, 3, 4]
numeros.reverse()
print(numeros) # [4, 3, 2, 1]
Copiar lista: copy
origen = ["abc", "def", "qwe", "123", 555]
copia = origen.copy()
print(copia) # ['abc', 'def', 'qwe', '123', 555]
Modificación de elementos
datos = ["abc", "def", "qwe", "123", 555]
datos[1] = "kkk"
print(datos) # ['abc', 'kkk', 'qwe', '123', 555]
Ordenamiento
Método sort (in-place)
lista_mix = ["asd", "nnn", "KKK", "QWQW"]
lista_mix.sort()
print(lista_mix) # ['KKK', 'QWQW', 'asd', 'nnn']
lista_mix.sort(reverse=True)
print(lista_mix) # ['nnn', 'asd', 'QWQW', 'KKK']
lista_mix.sort(key=str.lower)
print(lista_mix) # ['asd', 'KKK', 'nnn', 'QWQW']
Función sorted (nueva lista)
lista_original = ["asd", "nnn", "KKK", "QWQW"]
nueva = sorted(lista_original, reverse=True)
print(nueva) # ['nnn', 'asd', 'QWQW', 'KKK']
Listas multidimensionales
matriz = [["asd", 123], ["mm", 43], ["ll", 55]]
for fila in matriz:
for elemento in fila:
print(elemento, end=" ")
print()
# asd 123
# mm 43
# ll 55
Tuplas
Creación
Son inmutables: no permiten agregar, eliminar ni modificar elementos. Pueden contener diversos tipos de datos ordenados, por lo que soportan índices.
tupla = ("hello", [10, 20, 30], 123)
# Tupla de un solo elemento: obligatorio el uso de coma
un_solo = (10,)
print(type(un_solo)) # <class>
no_tupla = (10)
print(type(no_tupla)) # <class>
</class></class>
Operadores de pertenencia
valores = (123, "aaa", "bbb")
if "123" not in valores:
print("No existe")
Acceso y slicing
valores = (123, "aaa", "bbb")
print(valores[0:2]) # (123, 'aaa')
Recorrido
colores_t = ("abc", "bbb", "kkk", "ppp")
for color in colores_t:
print(color)
for i in range(len(colores_t)):
print(colores_t[i])
Diccionarios
Creación
Colección mutable de pares clave-valor. Las claves deben ser inmutables y únicas; los valores pueden repetirse.
persona = {"nombre": "qqq", "edad": 123}
otro = dict(clave1="v1", clave2="v2")
Acceso a valores
info = {"nombre": 11, "edad": 155, "mm": 999}
print(info.get("mm")) # 999
print(info["nombre"]) # 11
Recorrido
for clave in info:
print(clave) # nombre, edad, mm
for clave in info.keys():
print(clave)
for valor in info.values():
print(valor)
for item in info.items():
print(item, type(item)) # ('nombre', 11) <class>
for k, v in info.items():
print(k, v) # nombre 11, edad 155, mm 999
</class>
Adición y modificación
info["nueva"] = "ppp"
print(info) # {'nombre': 11, 'edad': 155, 'mm': 999, 'nueva': 'ppp'}
info.update(mm="1231")
print(info) # {'nombre': 11, 'edad': 155, 'mm': '1231', 'nueva': 'ppp'}
Eliminación
# pop: elimina por clave y retorna el valor
eliminado = info.pop("mm")
print(eliminado) # 999
# popitem: elimina y retorna un par (clave, valor) aleatorio
par = info.popitem()
print(par) # ('mm', 999) (ejemplo)
# del
del info["mm"]
# clear: vacía el diccionario
info.clear()
print(info) # {}
Conjuntos (set)
Creación
Colección mutable, no ordenada y sin elementos duplicados. Solo pueden almacenar tipos inmutables (cadena, entero, flotante, tupla).
# {} crea un diccionario vacío, no un conjunto
conjunto_vacio = set()
datos = {12, 0, "a"}
Operaciones algebraicas
a = {1, 2, 3}
b = {3, 4, 5}
# Intersección (&)
print(a & b) # {3}
# Unión (|)
print(a | b) # {1, 2, 3, 4, 5}
# Diferencia (-)
print(a - b) # {1, 2}
Métodos principales
s = {10, 20, "asd"}
s.add("kkk")
print(s) # {'kkk', 10, 20, 'asd'}
s.remove(10)
s.clear()
Recorrido
for elemento in s:
print(elemento)
# No se puede usar range porque no tiene índice.
String
Cadena inmutable de caracteres ordenados, accesibles mediante índice.
Cambio de mayúsculas/minúsculas
mensaje = "helloworld"
print(mensaje.upper()) # HELLOWORLD
print(mensaje.lower()) # helloworld
División
email = "123@qq.com"
partes = email.split("@")
print(partes) # ['123', 'qq.com']
Búsqueda
texto = "123@qq.com"
print(texto.count("1")) # 1
print(texto.find("1")) # 0
print(texto.find("x")) # -1
Verificación de inicio/fin
nombre = "qqqwwww"
print(nombre.endswith("www")) # True
print(nombre.startswith("q")) # True
Reemplazo
saludo = "HelloWorld"
nuevo = saludo.replace("o", "Hola", 1)
print(nuevo) # HellHolaWorld
Centrado
titulo = "HelloWorld"
print(titulo.center(20)) # HelloWorld
print(titulo.center(20, "*")) # *****HelloWorld*****
Eliminación de espacios/caracteres
texto_con_espacios = " HelloWorld "
print(texto_con_espacios.strip()) # HelloWorld
print(texto_con_espacios.lstrip()) # HelloWorld
print(texto_con_espacios.rstrip()) # HelloWorld
cadena = "lpkkkkllp"
print(cadena.strip("lp")) # kkkk
print(cadena.lstrip("lp")) # kkkkllp
print(cadena.rstrip("lp")) # lpkkkk
Formateo de cadenas
Operador %
nombre = "qq"
edad = 18
puntaje = 19.88
print("Nombre: %s, Edad: %d, Puntaje: %.1f" % (nombre, edad, puntaje))
f-strings
print(f"Nombre: {nombre}, Edad: {edad}, Puntaje: {puntaje}")
Método format
print("Nombre: {0}, Edad: {1}, Puntaje: {2}".format(nombre, edad, puntaje))
Validación de contenido
print("123".isdigit()) # True
print("一二三".isdigit()) # False
print("一二三".isnumeric()) # True
print("asd".isalpha()) # True
print("asd12".isalpha()) # False
print("asd12".isalnum()) # True
print("Hello World".istitle()) # True
print("hello World".istitle()) # False
print("Hello world".istitle()) # False
print("HelloWorld".istitle()) # False
print("Hello 2World".istitle()) # True
Concatenación
a = "abc"
b = "ddd"
print(a + b) # abcddd
union = "".join([a, b])
print(union) # abcddd
Eliminar duplicados en cadena
original = "hhhoooddd"
limpia = ""
for letra in original:
if letra not in limpia:
limpia += letra
print(limpia) # hod
Ejercicios prácticos
1. Problema del año 2000
anios_cortos = [88, 89, 90, 0, 99]
anios_completos = []
for anio in anios_cortos:
if anio != 0:
completo = "19" + str(anio)
else:
completo = "200" + str(anio)
anios_completos.append(completo)
print(anios_completos) # ['1988', '1989', '1990', '2000', '1999']
2. Simulación de carrito de compras
catalogo = []
carrito = []
# Ingreso de productos
for i in range(5):
producto = input("Ingrese el nombre del producto (código nombre): ")
catalogo.append(producto)
# Mostrar catálogo
for item in catalogo:
print(item)
# Compra
while True:
codigo = input("Ingrese el código del producto a comprar (q para salir): ")
if codigo == "q":
break
encontrado = False
for item in catalogo:
if codigo in item:
carrito.append(item)
print("Producto agregado al carrito")
encontrado = True
break
if not encontrado:
print("Producto no encontrado")
carrito.sort(reverse=True)
print("Productos comprados:")
for item in carrito:
print(item)
3. Simulación de reserva de boletos de tren
trenes = {
"G3333": ["Beijing Sur-Tianjin Sur", "16:06", "18:39", "00:33"],
"G5555": ["Beijing Sur-Tianjin Este", "16:06", "18:39", "00:33"],
"G6666": ["Beijing Sur-Tianjin Oeste", "16:06", "18:39", "00:33"],
"G7777": ["Beijing Sur-Tianjin Norte", "16:06", "18:39", "00:33"]
}
print("Código\tOrigen-Destino\tSalida\tLlegada\tDuración")
for codigo, datos in trenes.items():
print(codigo, end=" ")
for dato in datos:
print(dato, end=" ")
print()
seleccion = input("Ingrese el código del tren: ")
info = trenes.get(seleccion, "No existe")
if info != "No existe":
pasajero = input("Nombre del pasajero (varios separados por coma): ")
print(f"Ha comprado {seleccion} - {info[0]} a las {info[1]}. Pasajero: {pasajero}")
else:
print("Código de tren no válido")
4. Agenda telefónica
contactos = set()
for i in range(5):
entrada = input(f"Ingrese nombre y teléfono del contacto {i+1}: ")
contactos.add(entrada)
for registro in contactos:
print(registro)