📝 Strings y Formateo

⚠️
El 50% de los problemas de CodeWars involucran manipulación de strings. Domina esta sección y tienes media competición ganada.

🔤 Conceptos básicos

📖 Del libro

Un string es una serie de caracteres. En Python, todo lo que está entre comillas (simples o dobles) es un string. Puedes acceder a caracteres individuales usando índices, donde el primer carácter está en la posición 0.

→ Python Crash Course, Capítulo 2, pp. 19-25

texto = "Hola Mundo"

# Acceder a caracteres (índice empieza en 0)
texto[0]     # 'H'
texto[4]     # ' ' (espacio)
texto[-1]    # 'o' (último)
texto[-2]    # 'd' (penúltimo)

# Longitud
len(texto)   # 10

✂️ Slicing (rebanado)

📖 Del libro

El slicing permite extraer una porción de un string usando la sintaxis [inicio:fin]. El índice de inicio está incluido, pero el de fin NO. Si omites el inicio, empieza desde 0; si omites el fin, va hasta el final.

→ Python Crash Course, Capítulo 4, pp. 61-62

s = "ABCDEFGHIJ"
#    0123456789

s[0:3]    # 'ABC' (posiciones 0, 1, 2)
s[2:5]    # 'CDE'
s[:4]     # 'ABCD' (desde el inicio)
s[6:]     # 'GHIJ' (hasta el final)
s[-3:]    # 'HIJ' (últimos 3)
s[::-1]   # 'JIHGFEDCBA' (invertir)
💡
El truco del -1: s[::-1] invierte cualquier string o lista. Es la forma más rápida de comprobar palíndromos.

Ejemplos prácticos de slicing

# Primer carácter
s[0]

# Último carácter
s[-1]

# Todo menos el primero
s[1:]

# Todo menos el último
s[:-1]

# Primeros N caracteres
s[:n]

# Últimos N caracteres
s[-n:]

# ¿Es palíndromo?
if s == s[::-1]:
    print("Es palíndromo")

🛠️ Métodos de strings esenciales

📖 Del libro

Los métodos son funciones que pertenecen a un objeto. Los strings tienen muchos métodos útiles como lower(), upper(), strip(). Se llaman con un punto después del string: texto.lower().

→ Python Crash Course, Capítulo 2, pp. 20-23

Cambiar mayúsculas/minúsculas

s = "Hola Mundo"

s.lower()      # 'hola mundo'
s.upper()      # 'HOLA MUNDO'
s.capitalize() # 'Hola mundo' (solo primera)
s.title()      # 'Hola Mundo' (cada palabra)
s.swapcase()   # 'hOLA mUNDO'

Buscar y comprobar

s = "programación en python"

# Buscar posición (devuelve -1 si no encuentra)
s.find("python")     # 16
s.find("java")       # -1

# Comprobar si contiene
"python" in s       # True
"java" in s         # False

# Comprobar inicio/fin
s.startswith("prog")  # True
s.endswith("thon")    # True

# Contar ocurrencias
s.count("o")         # 3

Limpiar espacios

s = "  hola mundo  "

s.strip()    # 'hola mundo' (quita ambos lados)
s.lstrip()   # 'hola mundo  ' (solo izquierda)
s.rstrip()   # '  hola mundo' (solo derecha)
⚠️
Cuidado: Muchos problemas tienen espacios ocultos en la entrada. Usa strip() para limpiar antes de comparar.

Dividir y unir

# split(): string → lista
"uno dos tres".split()        # ['uno', 'dos', 'tres']
"a,b,c".split(",")             # ['a', 'b', 'c']
"hola".split()                # ['hola'] (1 elemento)

# join(): lista → string
" ".join(["uno", "dos"])       # 'uno dos'
",".join(["a", "b", "c"])     # 'a,b,c'
"".join(["h", "o", "l", "a"])  # 'hola'

Reemplazar

s = "hola mundo"

s.replace("mundo", "python")  # 'hola python'
s.replace("o", "0")           # 'h0la mund0' (todas)
s.replace("o", "0", 1)        # 'h0la mundo' (solo 1)

Comprobar tipo de contenido

"abc".isalpha()    # True (solo letras)
"123".isdigit()    # True (solo dígitos)
"abc123".isalnum() # True (letras y/o dígitos)
"ABC".isupper()    # True (todas mayúsculas)
"abc".islower()    # True (todas minúsculas)
"   ".isspace()    # True (solo espacios)

🎯 Patrones comunes en CodeWars

1. Invertir palabras (no letras)

# "hola mundo" → "mundo hola"
texto = input()
palabras = texto.split()
resultado = " ".join(palabras[::-1])
print(resultado)

2. Capitalizar cada palabra

# "hola mundo" → "Hola Mundo"
texto = input()
print(texto.title())

# O manualmente (más control):
palabras = texto.split()
resultado = " ".join(p.capitalize() for p in palabras)
print(resultado)

3. Verificar palíndromo

texto = input().lower().replace(" ", "")
if texto == texto[::-1]:
    print("Es palindromo")
else:
    print("No es palindromo")

4. Contar vocales

texto = input().lower()
vocales = "aeiou"
contador = 0
for letra in texto:
    if letra in vocales:
        contador += 1
print(contador)

# Versión corta:
print(sum(1 for c in texto if c in "aeiouAEIOU"))

5. Extraer números de un texto

texto = "tengo 3 manzanas y 5 peras"
numeros = [int(c) for c in texto.split() if c.isdigit()]
# [3, 5]

6. Eliminar caracteres repetidos consecutivos

# "aaabbbccc" → "abc"
texto = input()
resultado = texto[0]
for i in range(1, len(texto)):
    if texto[i] != texto[i-1]:
        resultado += texto[i]
print(resultado)

🔢 Formateo de números

🛑
MEMORIZA ESTO: El formato de decimales es la causa #1 de respuestas incorrectas.
n = 3.14159265

# Decimales fijos
f"{n:.2f}"   # '3.14'
f"{n:.3f}"   # '3.142' (redondea)
f"{n:.0f}"   # '3'

# Ancho mínimo (rellena con espacios)
f"{n:10.2f}"  # '      3.14' (10 caracteres total)

# Rellenar con ceros
x = 42
f"{x:05d}"   # '00042' (5 dígitos)

# Porcentaje
p = 0.756
f"{p:.1%}"   # '75.6%'

✅ Ejercicios de práctica

📝
Ejercicio 1: Lee una frase y muestra cuántas palabras tiene que empiecen por vocal.
👁️ Ver solución
frase = input().lower()
palabras = frase.split()
contador = 0
for p in palabras:
    if p[0] in "aeiou":
        contador += 1
print(contador)
📝
Ejercicio 2: Lee un texto y muestra la palabra más larga.
👁️ Ver solución
texto = input()
palabras = texto.split()
mas_larga = ""
for p in palabras:
    if len(p) > len(mas_larga):
        mas_larga = p
print(mas_larga)

# Versión corta:
print(max(input().split(), key=len))
📝
Ejercicio 3: Lee una frase y elimina las vocales.
👁️ Ver solución
texto = input()
resultado = ""
for c in texto:
    if c.lower() not in "aeiou":
        resultado += c
print(resultado)

# Versión corta:
print("".join(c for c in input() if c.lower() not in "aeiou"))