Python / len() / Obtener la longitud de una cadena
En Python, len(text) devuelve el número de puntos de código Unicode de una cadena, incluidos espacios y saltos de línea. No siempre coincide con los bytes ni con los caracteres que una persona percibe en pantalla. En colecciones que admiten longitud, como listas, tuplas y diccionarios, cuenta los elementos.
Uso básico, espacios y saltos de línea
len() recibe un objeto que admite longitud. Una cadena vacía mide cero; las comillas que la delimitan no cuentan. Los puntos de código identifican elementos de texto y son las unidades del tipo str de Python.
Use Python 3. Guarde cada ejemplo completo en UTF-8 como length_example.py y ejecute python length_example.py, o python3 según su instalación. Sustituya el contenido para ejecutar los ejemplos independientemente.
for text in ("abc", "", "a b", "a\nb"):
print(repr(text), len(text))
Resultado esperado:
'abc' 3
'' 0
'a b' 3
'a\nb' 3
"a b" contiene un espacio y "a\nb" un salto de línea, por lo que ambos miden tres. La notación fuente \n usa dos caracteres, pero representa un único salto en el valor. repr() permite ver la diferencia.
Longitud de cadena frente a bytes UTF-8
Codificar texto en UTF-8 produce bytes para almacenarlo o transmitirlo. len(text) cuenta puntos de código y len(text.encode("utf-8")) cuenta bytes codificados. Aquí, \u00e9 representa é.
text = "caf\u00e9"
data = text.encode("utf-8")
print(len(text))
print(len(data))
4
5
El texto contiene cuatro puntos de código, pero cinco bytes UTF-8 porque el último carácter requiere dos bytes. Para límites de archivos o protocolos en bytes, mida con la codificación exigida. La longitud de una cadena tampoco mide directamente su consumo de memoria.
Caracteres combinados y emoji
é puede representarse mediante un punto de código o mediante e seguido de un acento combinante, en total dos. Un aspecto similar no garantiza valores ni longitudes iguales. Los grupos de grafemas Unicode reúnen puntos de código en unidades cercanas a los caracteres percibidos.
import unicodedata
composed = "\u00e9"
decomposed = "e\u0301"
emoji = "\U0001f469\u200d\U0001f4bb"
print(len(composed), len(decomposed))
print(composed == decomposed)
print(len(unicodedata.normalize("NFC", decomposed)))
print(len(emoji))
1 2
False
1
3
La normalización Unicode con unicodedata.normalize("NFC", text) compone representaciones canónicamente combinables. Aquí cambia una longitud de dos a uno. No transforma todos los emoji o combinaciones en un punto de código: la secuencia de la tecnóloga del ejemplo contiene tres.
Antes de implementar un «límite de caracteres», decida entre puntos de código, grafemas y bytes. NFC no sustituye el recuento de grafemas; use una implementación de las reglas adecuadas de segmentación Unicode y compruebe entradas representativas.
Colecciones y valores no admitidos
Las listas, tuplas, diccionarios y conjuntos también tienen longitud. Los diccionarios cuentan claves y los conjuntos elementos distintos. Una lista anidada cuenta sus elementos externos sin sumar automáticamente su contenido.
print(len([10, 20, 30]))
print(len((10, 20)))
print(len({"a": 10, "b": 20}))
print(len({1, 1, 2}))
rows = [[1, 2], [3, 4]]
print(len(rows))
print(sum(len(row) for row in rows))
3
2
2
2
2
4
Los números y None no definen longitud y generan TypeError. Convierta un número a cadena si necesita medir su representación, incluidos signo negativo y punto decimal. Ser iterable no implica admitir len(): los generadores ordinarios no tienen longitud.
for value in (1234, None):
try:
print(len(value))
except TypeError:
print("TypeError")
print(len(str(1234)))
items = (n * 2 for n in range(3))
try:
print(len(items))
except TypeError:
print("TypeError")
values = list(items)
print(len(values))
print(list(items))
TypeError
TypeError
4
TypeError
3
[]
Convertir un generador en lista permite contar, pero consume sus elementos y los guarda en memoria. El segundo list(items) queda vacío. No materialice datos enormes ni iteradores infinitos solo para conocer su longitud.
Ejemplo completo de validación de longitud
Esta función acepta cadenas y comprueba entre 1 y 12 puntos de código después de quitar espacios de los extremos. Rechaza entradas vacías o compuestas solo de espacios, sin modificar la cadena original.
def valid_name(text):
if not isinstance(text, str):
raise TypeError("name must be a string")
name = text.strip()
return 1 <= len(name) <= 12
for text in ("Ada", " ", "a" * 13, " Ada "):
print(repr(text), valid_name(text))
'Ada' True
' ' False
'aaaaaaaaaaaaa' False
' Ada ' True
No valida contenido ni categorías de caracteres, no quita todos los espacios interiores ni limita caracteres visuales. Alinee la unidad de longitud, la política de espacios, los caracteres permitidos y la validación del servidor para que interfaz y almacenamiento evalúen la misma entrada de forma coherente.




