web-dev-qa-db-fra.com

Comment puis-je obtenir le nombre d'éléments dans une liste?

Considérer ce qui suit:

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

# FAKE METHOD:
items.amount()  # Should return 3

Comment obtenir le nombre d'éléments dans la liste items?

1807
y2k

La fonction len() peut être utilisée avec plusieurs types différents dans Python - des types intégrés et des types de bibliothèque. Par exemple:

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

La documentation officielle 2.x est ici: len()
La documentation officielle 3.x est disponible: len()

2508
gnud

Comment obtenir la taille d'une liste?

Pour trouver la taille d’une liste, utilisez la fonction intégrée, len:

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

Et maintenant:

len(items)

renvoie 3.

Explication

Tout dans Python est un objet, y compris des listes. Tous les objets ont un en-tête quelconque dans l'implémentation C.

Les listes et autres objets intégrés similaires avec une "taille" en Python, en particulier, ont un attribut appelé ob_size, où le nombre d'éléments de l'objet est mis en cache. Donc, vérifier le nombre d'objets dans une liste est très rapide.

Mais si vous vérifiez si la taille de la liste est égale ou non à zéro, n'utilisez pas len - à la place, placez la liste dans un contexte booléen - elle est traitée comme étant False si vide, True sinon .

De la docs

len(s)

Renvoie la longueur (le nombre d'éléments) d'un objet. L'argument peut être une séquence (chaîne, octets, tuple, liste ou plage, par exemple) ou une collection (dictionnaire, jeu ou jeu figé).

len est implémenté avec __len__, à partir du modèle de données docs :

object.__len__(self)

Appelé pour implémenter la fonction intégrée len(). Doit renvoyer la longueur de l'objet, un entier> = 0. En outre, un objet qui ne définit pas une méthode __nonzero__() [in Python 2 ou __bool__() dans Python 3] et dont La méthode __len__() renvoie zéro est considéré comme faux dans un contexte booléen.

Et nous pouvons aussi voir que __len__ est une méthode de listes:

items.__len__()

renvoie 3.

Types intégrés vous pouvez obtenir le len (longueur) de

Et en fait, nous voyons que nous pouvons obtenir cette information pour tous les types décrits:

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

Ne pas utiliser len pour tester une liste vide ou non vide

Pour tester une longueur spécifique, bien sûr, testez simplement l'égalité:

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

Mais il existe un cas particulier pour tester une liste de longueur zéro ou l'inverse. Dans ce cas, ne testez pas l'égalité.

Aussi, ne faites pas:

if len(items): 
    ...

Au lieu de cela, faites simplement:

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

ou

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

Je explique pourquoi ici mais en bref, if items ou if not items est à la fois plus lisible et plus performant.

214
Aaron Hall

Bien que cela puisse ne pas être utile en raison du fait qu'il serait beaucoup plus logique de fonctionner comme une fonctionnalité "prête à l'emploi", un hack assez simple consisterait à construire une classe avec une propriété length:

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

Vous pouvez l'utiliser comme ceci:

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

Essentiellement, il est exactement identique à un objet de la liste, avec l'avantage supplémentaire de posséder une propriété OOP length conviviale.

Comme toujours, votre kilométrage peut varier.

72
Naftuli Kay

Outre len , vous pouvez également utiliser operator.length_hint (requiert Python 3.4+). Pour un list normal, les deux sont équivalents, mais _length_hint_ permet d’obtenir la longueur d’un lister-itérateur, ce qui pourrait être utile dans certaines circonstances:

_>>> 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
_

Mais _length_hint_ est par définition seulement un "indice", donc la plupart du temps len est meilleur.

J'ai vu plusieurs réponses suggérant d'accéder à ___len___. Cela convient lorsque vous utilisez des classes intégrées telles que list, mais vous risquez de rencontrer des problèmes avec les classes personnalisées, car len (et _length_hint_) implémentent certaines vérifications de sécurité. Par exemple, les deux n'autorisent pas les longueurs négatives ou les longueurs dépassant une certaine valeur (la valeur _sys.maxsize_). Il est donc toujours plus sûr d'utiliser la fonction len au lieu de la méthode ___len___!

15
MSeifert

Et pour être complet, il est possible de ne pas utiliser la fonction len() (je ne tolérerais pas cela comme une bonne option. NE PROGRAMMEZ PAS COMME CECI À PYTHON):

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

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

(Les deux points dans list[:] sont implicites et sont donc également facultatifs.)

La leçon à tirer ici pour les nouveaux programmeurs est la suivante: vous ne pouvez pas obtenir le nombre d’éléments dans une liste sans les compter à un moment donné. En calcul, il est préférable de garder une trace du nombre d'éléments au fur et à mesure que vous les ajoutez. Voir la réponse de Naftuli Kay.

6
Jonathan Komar

Répondant à votre question comme les exemples également donnés précédemment:

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

print items.__len__()
6
Shai Alon