Comment puis-je obtenir le nombre d'éléments dans une liste?
De considérer les éléments suivants:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
Comment puis-je obtenir le nombre d'éléments dans la liste items
?
- Vous êtes évidemment demander le nombre d'éléments dans la liste. Si un chercheur vient ici à la recherche de la taille de l'objet en mémoire, c'est la question & réponses qu'ils sont à la recherche de: Comment puis-je déterminer la taille d'un objet en Python?
InformationsquelleAutor y2k | 2009-11-11
Vous devez vous connecter pour publier un commentaire.
La
len()
fonction peut être utilisée avec différents types de Python - à la fois intégré dans les types et les types de bibliothèques. Par exemple:Officiel 2.x la documentation est ici:
len()
Officiel 3.x la documentation est ici:
len()
Pour trouver la taille d'une liste, utilisez la fonction builtin,
len
:Et maintenant:
renvoie 3.
Explication
Tout en Python est un objet, y compris les listes. Tous les objets ont un en-tête de la sorte dans le C mise en œuvre.
Listes et d'autres semblables builtin objets avec une "taille" en Python, en particulier, ont un attribut appelé
ob_size
, où le nombre d'éléments dans l'objet est mis en cache. Par conséquent, en vérifiant le nombre d'objets dans une liste est très rapide.Mais si vous vérifiez si la taille de la liste est égal à zéro ou pas, n'utilisez pas de
len
- au lieu de cela, mettre la liste dans un contexte booléen - elle traitée comme Fausse si vide, True sinon.De la docs
len(s)
len
est mis en œuvre avec__len__
, à partir du modèle de données docs:object.__len__(self)
Et nous pouvons également voir que
__len__
est une méthode de listes:renvoie 3.
Builtin types que vous pouvez obtenir le
len
(longueur) deEt, en fait, nous voyons que nous pouvons obtenir cette information pour tous les types décrits:
Ne pas utiliser
len
pour tester un vide ou non vide listeDe test pour une longueur donnée, bien sûr, il suffit de tester l'égalité:
Mais il y a un cas particulier du test d'un zéro de la longueur de la liste, ou l'inverse. Dans ce cas, ne pas tester l'égalité.
Aussi, ne pas le faire:
Au lieu de cela, il suffit de faire:
ou
Je expliquer pourquoi ici mais en bref,
if items
ouif not items
est à la fois plus lisible et plus performant.Même si cela peut ne pas être utile en raison du fait qu'il avait de faire beaucoup plus de sens que d'être "hors de la boîte" fonctionnalité, assez simple hack serait de construire une classe avec un
length
propriété:Vous pouvez l'utiliser comme ceci:
Essentiellement, c'est exactement identique à un objet de la liste, avec l'avantage d'avoir une programmation orientée objet-friendly
length
propriété.Comme toujours, votre kilométrage peut varier.
length = property(len)
et sauter une ligne en fonction wrapper et de conserver la documentation / l'introspection delen
avec votre propriété.Outre
len
vous pouvez également utiliseropérateur.length_hint
(nécessite Python 3.4+). Pour une normale delist
les deux sont équivalents, maislength_hint
permet d'obtenir la longueur d'une liste itérateur, qui pourrait être utile dans certaines circonstances:Mais
length_hint
est, par définition, qu'une "astuce", donc la plupart du tempslen
est mieux.J'ai vu plusieurs réponses, ce qui suggère l'accès
__len__
. C'est tout droit lorsque vous traitez avec des classes intégrées commelist
, mais elle pourrait conduire à des problèmes de classes personnalisées, carlen
(etlength_hint
) mettre en place certains contrôles de sécurité. Par exemple, les deux ne permettent pas négatif des longueurs ou des longueurs qui dépassent une certaine valeur (lasys.maxsize
valeur). Donc, il est toujours plus sûr d'utiliser lelen
fonction de la place de la__len__
méthode!De répondre à votre question, comme les exemples donnés précédemment:
__foo__
: c'est juste une convention, d'une manière pour le Python système à utiliser des noms qui n'entre pas en conflit avec des noms d'utilisateur. 2._foo
: c'est juste une convention, d'une manière pour le programmeur d'indiquer que la variable est privé (quoi que cela signifie en Python). 3.__foo
: cela a un vrai sens: l'interprète remplace ce nom par_classname__foo
comme un moyen de s'assurer que le nom ne se chevauchent pas avec un nom similaire dans une autre classe. * Aucune autre forme de souligne un sens à l'Python monde. * Il n'y a pas de différence entre la classe, une variable globale, etc dans ces conventions.Et pour être complet, il est possible sans l'aide de la
len()
fonction (je ne tolère pas que c'est une bonne option N'PROGRAMME de CE genre EN PYTHON):(Le côlon dans
list[:]
est implicite et est donc également en option.)La leçon ici pour les nouveaux programmeurs est: Vous ne pouvez pas obtenir le nombre d'éléments dans une liste sans compter à un certain point. De calcul, il est préférable de garder une trace du nombre d'éléments que vous ajoutez. Voir Naftuli Kay réponse.
for item in list[:]:
? Pourquoi ne pasfor item in list:
? Aussi, je ne l'utiliserais+= 1
à incrémenter.En termes de la façon dont
len()
fonctionne réellement, c'est sa C de la mise en œuvre:Py_ssize_t
est la longueur maximale que l'objet peut avoir.PyObject_Size()
est une fonction qui renvoie la taille d'un objet. Si il ne peut pas déterminer la taille d'un objet, il renvoie -1. Dans ce cas, ce bloc de code sera exécuté:Et une exception est levée comme un résultat. Sinon, ce bloc de code sera exécuté:
res
qui est unC
entier, est converti en un pythonlong
et retourné. Toutes python entiers sont stockés en tant quelongs
depuis Python 3.