¿Cómo obtengo la cantidad de elementos en una lista (longitud de una lista) en Python?

8 minutos de lectura

avatar de usuario de y2k
y2k

¿Cómo obtengo el número de elementos en la lista? items?

items = ["apple", "orange", "banana"]

# There are 3 items.

  • Obviamente, está preguntando por la cantidad de elementos en la lista. Si un buscador viene aquí buscando el tamaño del objeto en la memoria, esta es la pregunta y las respuestas reales que está buscando: ¿Cómo determino el tamaño de un objeto en Python?

    – Rusia debe sacar a Putin

    31/10/2016 a las 14:37


avatar de usuario de gnud
gruñido

los len() La función se puede usar con varios tipos diferentes en Python, tanto tipos incorporados como tipos de biblioteca. Por ejemplo:

>>> len([1, 2, 3])
3

Rusia debe eliminar el avatar de usuario de Putin
Rusia debe sacar a Putin

¿Cómo obtener el tamaño de una lista?

Para encontrar el tamaño de una lista, use la función incorporada, len:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

Y ahora:

len(items)

devuelve 3.

Explicación

Todo en Python es un objeto, incluidas las listas. Todos los objetos tienen un encabezado de algún tipo en la implementación de C.

Las listas y otros objetos integrados similares con un “tamaño” en Python, en particular, tienen un atributo llamado ob_size, donde se almacena en caché el número de elementos del objeto. Entonces, verificar la cantidad de objetos en una lista es muy rápido.

Pero si está comprobando si el tamaño de la lista es cero o no, no use len – en su lugar, coloque la lista en un contexto booleano – se trata como False si está vacía, True en caso contrario.

Desde el documentos

len(s)

Devuelve la longitud (el número de elementos) de un objeto. El argumento puede ser una secuencia (como una cadena, bytes, tupla, lista o rango) o una colección (como un diccionario, un conjunto o un conjunto congelado).

len se implementa con __len__del modelo de datos documentos:

object.__len__(self)

Llamado para implementar la función incorporada len(). Debería devolver la longitud del objeto, un número entero >= 0. Además, un objeto que no define un __nonzero__() [in Python 2 or __bool__() in Python 3] método y cuyo __len__() El método devuelve cero se considera falso en un contexto booleano.

Y también podemos ver que __len__ es un método de listas:

items.__len__()

devuelve 3.

Tipos incorporados que puede obtener len (longitud de

Y de hecho vemos que podemos obtener esta información para todos los tipos descritos:

>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list, 
                                            range, dict, set, frozenset))
True

No utilice len para probar una lista vacía o no vacía

Para probar una longitud específica, por supuesto, simplemente pruebe la igualdad:

if len(items) == required_length:
    ...

Pero hay un caso especial para probar una lista de longitud cero o al revés. En ese caso, no pruebe la igualdad.

Además, no hagas:

if len(items): 
    ...

En su lugar, simplemente haz lo siguiente:

if items:     # Then we have some items, not empty!
    ...

o

if not items: # Then we have an empty list!
    ...

Explico por qué aquí pero en resumen, if items o if not items es más legible y más eficaz.

Si bien esto puede no ser útil debido al hecho de que tendría mucho más sentido como una funcionalidad “lista para usar”, un truco bastante simple sería construir una clase con un length propiedad:

class slist(list):
    @property
    def length(self):
        return len(self)

Puedes usarlo así:

>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Esencialmente, es exactamente idéntico a un objeto de lista, con el beneficio adicional de tener un OOP amigable length propiedad.

Como siempre, su millaje puede variar.

  • solo para que lo sepas, puedes hacer length = property(len) y omita la función de envoltura de una línea y mantenga la documentación / introspección de len con tu propiedad.

    – Tadhg McDonald-Jensen

    13 de junio de 2016 a las 2:17

Avatar de usuario de MSeifert
MSeifert

Además len también puedes usar operator.length_hint (requiere Python 3.4+). para una normalidad list ambos son equivalentes, pero length_hint hace posible obtener la longitud de un iterador de lista, lo que podría ser útil en ciertas circunstancias:

>>> from operator import length_hint
>>> l = ["apple", "orange", "banana"]
>>> len(l)
3
>>> length_hint(l)
3

>>> list_iterator = iter(l)
>>> len(list_iterator)
TypeError: object of type 'list_iterator' has no len()
>>> length_hint(list_iterator)
3

Pero length_hint es, por definición, solo una “pista”, por lo que la mayoría de las veces len es mejor.

He visto varias respuestas que sugieren acceder __len__. Esto está bien cuando se trata de clases integradas como listpero podría generar problemas con las clases personalizadas, porque len (y length_hint) implementar algunos controles de seguridad. Por ejemplo, ambos no permiten longitudes negativas o longitudes que excedan un cierto valor (el sys.maxsize valor). Así que siempre es más seguro usar el len función en lugar de la __len__ ¡método!

Avatar de usuario de Jonathan Komar
jonathan komar

Y por completitud (principalmente educativa), es posible sin usar el len() función. No aprobaría esto como una buena opción. NO PROGRAMAR ASÍ EN PYTHONpero tiene un propósito para aprender algoritmos.

def count(list):
    item_count = 0
    for item in list[:]:
        item_count += 1
    return item_count

count([1,2,3,4,5])

(La operación de índice con dos puntos en list[:] es implícito y, por lo tanto, también es opcional).

La lección aquí para los nuevos programadores es: no se puede obtener el número de elementos de una lista sin contarlos en algún momento. La pregunta es: ¿cuándo es un buen momento para contarlos? Por ejemplo, código de alto rendimiento como la llamada al sistema connect para sockets (escrito en C) connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);, no calcula la longitud de los elementos (dando esa responsabilidad al código de llamada). ¿Observe que la longitud de la dirección se pasa para ahorrar el paso de contar la longitud primero? Otra opción: computacionalmente, podría tener sentido realizar un seguimiento de la cantidad de elementos a medida que los agrega dentro del objeto que pasa. Tenga en cuenta que esto ocupa más espacio en la memoria. Vea la respuesta de Naftuli Kay.

Ejemplo de seguimiento de la longitud para mejorar el rendimiento mientras se ocupa más espacio en la memoria. Tenga en cuenta que nunca uso la función len() porque se realiza un seguimiento de la longitud:

class MyList(object):
    def __init__(self):
        self._data = []
        self.length = 0 # length tracker that takes up memory but makes length op O(1) time
        

        # the implicit iterator in a list class
    def __iter__(self):
        for elem in self._data:
            yield elem
            
    def add(self, elem):
        self._data.append(elem)
        self.length += 1
            
    def remove(self, elem):
        self._data.remove(elem)
        self.length -= 1
            
mylist = MyList()
mylist.add(1)
mylist.add(2)
mylist.add(3)
print(mylist.length) # 3
mylist.remove(3)
print(mylist.length) # 2

  • Por qué for item in list[:]:? Por que no for item in list:? Además, usaría += 1 para incrementar

    – Abuelita dolorida

    30 de abril de 2019 a las 19:13

  • @GrannyAching Mencioné explícitamente los dos puntos opcionales (especificador de rango). Dejé el especificador de rango allí con fines educativos; es bueno saber que está implícito. Un tipo de lista [] también se infiere, como usted sugiere, equivalente a mi código. El operador de incremento también es equivalente a sumar 1 a una variable existente, pero más corto en todos los casos. Así que estaría de acuerdo en que debería usarse si ese es su razonamiento. De todos modos, este código no debe ponerse en producción en ningún lado (excepto cuando se está aprendiendo a programar).

    – Jonathan Komar

    2 de mayo de 2019 a las 6:29


  • Si vamos por la madriguera del conejo de “no hagas esto pero es divertido”, ofrezco length = max(enumerate(list))[0] + 1.

    -Kirk Strauser

    8 dic 2020 a las 21:56

  • @KirkStrauser Jaja, me reí de esta inteligente evasión en len()

    – Jonathan Komar

    15 mayo 2021 a las 19:51

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Respondiendo a su pregunta como los ejemplos también dados anteriormente:

items = []
items.append("apple")
items.append("orange")
items.append("banana")

print items.__len__()

  • Por qué for item in list[:]:? Por que no for item in list:? Además, usaría += 1 para incrementar

    – Abuelita dolorida

    30 de abril de 2019 a las 19:13

  • @GrannyAching Mencioné explícitamente los dos puntos opcionales (especificador de rango). Dejé el especificador de rango allí con fines educativos; es bueno saber que está implícito. Un tipo de lista [] también se infiere, como usted sugiere, equivalente a mi código. El operador de incremento también es equivalente a sumar 1 a una variable existente, pero más corto en todos los casos. Así que estaría de acuerdo en que debería usarse si ese es su razonamiento. De todos modos, este código no debe ponerse en producción en ningún lado (excepto cuando se está aprendiendo a programar).

    – Jonathan Komar

    2 de mayo de 2019 a las 6:29


  • Si vamos por la madriguera del conejo de “no hagas esto pero es divertido”, ofrezco length = max(enumerate(list))[0] + 1.

    -Kirk Strauser

    8 dic 2020 a las 21:56

  • @KirkStrauser Jaja, me reí de esta inteligente evasión en len()

    – Jonathan Komar

    15 mayo 2021 a las 19:51

Puedes usar el len() función para encontrar la longitud de un iterable en python.

my_list = [1, 2, 3, 4, 5]
print(len(my_list))  # OUTPUT: 5

los len() La función también funciona con cadenas:

my_string = "hello"
print(len(my_string))  # OUTPUT: 5

Así que para concluir, len() funciona con cualquier secuencia o colección (u objeto de cualquier tamaño que defina __len__).

¿Ha sido útil esta solución?