HOWTO · Python

Obtener la longitud de un array de Python

Este artículo presenta cómo encontrar la longitud de un objeto Python usando la función len() o el método __len__().

En esta página

Para obtener la longitud de un array o una lista de Python, normalmente basta con llamar una vez a len(). Devuelve el número de elementos de un objeto con tamaño definido, como una lista, una tupla, una cadena, un diccionario o array.array. El protocolo de longitud de Python también permite que una clase personalizada defina cómo se cuentan sus instancias. Algunos iteradores, incluidos los generadores, no tienen un tamaño definido y requieren otro método.

Obtener la longitud de una lista de Python con len()

Pasa la lista a la función incorporada len(). El resultado es un entero que indica el número de elementos, independientemente de los valores que contenga la lista.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

my_list = [1, 2, 3, 4, 5]
length_of_list = len(my_list)
print(length_of_list)

Este ejemplo muestra el número de elementos de la lista. Puedes usar el mismo patrón con listas de cadenas, números u otros objetos. El resultado cuenta los elementos del nivel exterior; si una lista contiene otras listas, len() no suma los elementos que hay dentro de ellas.

Obtener la longitud de otros objetos de Python

len() funciona con objetos que exponen una longitud. Para una cadena, devuelve el número de puntos de código Unicode, que no siempre coincide con el número de caracteres que percibe una persona cuando un carácter está formado por varios puntos de código. Para un diccionario, cuenta las claves. Una tupla, un conjunto, un objeto de tipo bytes y array.array también informan de su número de elementos. Por ejemplo, len("Python") devuelve el número de puntos de código de esa cadena, mientras que len({"name": "Ada", "language": "Python"}) cuenta sus dos claves.

Que un objeto sea iterable no garantiza que tenga una longitud. len() no cuenta los elementos recorriendo cualquier iterable: consulta el tamaño del objeto. Esto resulta útil cuando el objeto ya conoce el número de elementos, pero no es una forma universal de contar un flujo de valores. No des por sentado que todas las llamadas tienen el mismo rendimiento: el costo depende de la implementación del objeto.

Entender la relación entre len() y __len__()

La función incorporada len(obj) utiliza el protocolo de longitud de Python. Una clase suele participar en él definiendo el método especial __len__(), que devuelve un entero no negativo con el número de elementos de la instancia. En el código habitual de una aplicación, llama a len(obj) en lugar de invocar directamente a obj.__len__(). La función incorporada es la interfaz estándar: también funciona con los tipos incorporados y permite que Python aplique su búsqueda normal de métodos especiales.

Aquí tienes una clase personalizada sencilla que almacena sus valores en una lista:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

class CustomList:
    def __init__(self, elements):
        self.elements = elements

    def __len__(self):
        return len(self.elements)

my_custom_list = CustomList([1, 2, 3, 4, 5])
print(len(my_custom_list))

La clase delega el recuento en la lista que contiene, y quienes la usan pueden recurrir a la interfaz familiar len(). Una implementación personalizada debe mantener el recuento declarado en consonancia con el contenido real del objeto. Definir __len__() no hace que cualquier objeto pueda contarse, y llamar a len() no es una técnica general para evitar excepciones.

Manejar objetos que no tienen longitud

Los generadores y muchos otros iteradores producen valores a medida que se consumen y no almacenan un recuento total. No se admite llamar a len() con estos objetos sin tamaño definido. Si necesitas contar todos los valores y puedes consumir el iterador, cuenta sus elementos recorriéndolo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

generator = (number for number in range(5))
item_count = sum(1 for _ in generator)
print(item_count)

Este método llega al final del generador, por lo que después ya no podrás obtener de él los valores que produjo. Si necesitas usar esos valores más adelante, primero materialízalos con list(generator) y luego llama a len() con esa lista. La materialización mantiene los valores en memoria; si el flujo es grande o ilimitado, elige un método adecuado para los datos en vez de intentar calcular de antemano un total.

Obtener la longitud de varios objetos con map()

Para aplicar len() a varios objetos con tamaño definido, pásala como función a map(). En Python 3, map() devuelve un iterador; envuélvelo con list() si quieres ver y conservar juntos todos los recuentos:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

objects = [[1, 2, 3], ("a", "b"), "Python"]
lengths = list(map(len, objects))
print(lengths)

La lista resultante contiene un recuento por cada objeto de entrada y mantiene el mismo orden. Todos los objetos de objects deben admitir len(); si entre ellos hay un iterador sin tamaño definido, no se podrán obtener todas las longitudes solicitadas. Si solo necesitas procesar cada recuento una vez, puedes iterar directamente sobre map(len, objects) sin crear una lista. Usa la versión con lista cuando necesites mostrar, indexar o reutilizar el conjunto completo de recuentos.