¿Cómo obtengo el número de elementos en una lista en Python?

Considerar:

items = [] items.append("apple") items.append("orange") items.append("banana") # FAKE METHOD:: items.amount() # Should return 3 

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

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

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

La documentación oficial 2.x está aquí: len()
La documentación oficial 3.x está aquí: len()

¿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, incluyendo listas. Todos los objetos tienen un encabezado de algún tipo en la implementación de C.

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

Pero si está verificando 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 tratará como Falso si está vacío; en caso contrario , haga len en Verdadero .

De los docs

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, conjunto o conjunto congelado).

len se implementa con __len__ , a partir de los documentos del modelo de datos:

object.__len__(self)

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

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

 items.__len__() 

devuelve 3.

Tipos incorporados se puede obtener el 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, xrange, dict, set, frozenset)) True 

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

Por supuesto, para probar una longitud específica, simplemente pruebe la igualdad:

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

Pero hay un caso especial para probar una lista de longitud cero o la inversa. En ese caso, no pruebes la igualdad.

Además, no hagas:

 if len(items): ... 

En su lugar, simplemente haga:

 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 son más legibles y más eficaces.

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

 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 una propiedad de length compatible con OOP.

Como siempre, su kilometraje puede variar.

Además de len , también puedes usar operator.length_hint (requiere Python 3.4+). Para una list normal, 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 “sugerencia”, por lo que la mayor parte del tiempo len es mejor.

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

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

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

Y para completar, es posible sin usar la función len() (no aprobaría esto como una buena opción):

 def count(list): item_count = 0 for item in list[:]: item_count = item_count + 1 return item_count count([1,2,3,4,5]) 

(Los dos puntos en la list[:] están implícitos y, por lo tanto, también son opcionales).