HOWTO · Python
Obtenir la longueur d'un tableau Python
Cet article explique comment trouver la longueur d'un objet python à l'aide de la fonction len() ou de la méthode __len__().
Sur cette page
Pour obtenir la longueur d’un tableau ou d’une liste Python, un seul appel à len() suffit généralement. Il renvoie le nombre d’éléments d’un objet qui possède une longueur, comme une liste, un tuple, une chaîne de caractères, un dictionnaire ou un objet array.array. Le protocole de longueur de Python permet aussi à une classe personnalisée de définir comment compter ses instances. Certains itérateurs, notamment les générateurs, n’ont pas de longueur : il faut alors procéder autrement.
Obtenir la longueur d’une liste Python avec len()
Passez la liste à la fonction intégrée len(). Le résultat est un entier qui indique le nombre d’éléments, quelles que soient les valeurs contenues dans la liste.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
my_list = [1, 2, 3, 4, 5]
length_of_list = len(my_list)
print(length_of_list)
Cet exemple affiche le nombre d’éléments de la liste. Vous pouvez utiliser la même méthode avec une liste de chaînes de caractères, de nombres ou d’autres objets. Le décompte porte sur les éléments du niveau extérieur : si une liste contient des listes imbriquées, len() n’additionne pas leurs éléments.
Obtenir la longueur d’autres objets Python
len() fonctionne avec les objets qui exposent une longueur. Pour une chaîne de caractères, il renvoie le nombre de points de code Unicode, qui ne correspond pas nécessairement au nombre de caractères perçus par l’utilisateur lorsqu’un caractère est formé de plusieurs points de code. Pour un dictionnaire, il compte les clés. Un tuple, un ensemble, un objet bytes et array.array indiquent également leur nombre d’éléments. Par exemple, len("Python") donne le nombre de points de code de cette chaîne, tandis que len({"name": "Ada", "language": "Python"}) compte ses deux clés.
Le fait qu’un objet soit itérable ne garantit pas qu’il ait une longueur. len() ne compte pas les éléments en parcourant n’importe quel itérable : il demande à l’objet sa taille. Cette fonction est donc utile lorsque l’objet connaît déjà son nombre d’éléments, mais ne permet pas de compter n’importe quel flux de valeurs. Ne supposez pas que tous les appels ont les mêmes caractéristiques de performance : leur coût dépend de l’implémentation de l’objet.
Comprendre le lien entre len() et __len__()
La fonction intégrée len(obj) utilise le protocole de longueur de Python. Une classe y participe généralement en définissant la méthode spéciale __len__(), qui renvoie un entier non négatif représentant le nombre d’éléments de son instance. Dans le code applicatif courant, appelez len(obj) au lieu d’invoquer directement obj.__len__(). La fonction intégrée est l’interface standard : elle fonctionne aussi avec les types intégrés et laisse Python appliquer la recherche habituelle des méthodes spéciales.
Voici une petite classe personnalisée qui stocke ses valeurs dans une liste :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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 classe délègue le décompte à la liste qu’elle contient, et les appelants utilisent l’interface familière len(). Une implémentation personnalisée doit renvoyer un nombre cohérent avec le contenu réel de l’objet. Définir __len__() ne permet pas de compter des objets sans rapport, et appeler len() n’est pas une méthode générale pour éviter les exceptions.
Gérer les objets qui n’ont pas de longueur
Les générateurs et de nombreux autres itérateurs produisent des valeurs au fur et à mesure qu’ils sont consommés et ne mémorisent pas leur nombre total. Il n’est pas possible d’appeler len() sur ces objets dépourvus de longueur. Si vous devez compter toutes les valeurs et que vous pouvez consommer l’itérateur, comptez ses éléments en le parcourant :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
generator = (number for number in range(5))
item_count = sum(1 for _ in generator)
print(item_count)
Cette méthode parcourt le générateur jusqu’à la fin : vous ne pourrez donc plus récupérer ensuite ses valeurs. Si vous devez les réutiliser, matérialisez-les d’abord avec list(generator), puis appelez len() sur cette liste. La matérialisation conserve les valeurs en mémoire ; pour un flux volumineux ou sans fin, choisissez une méthode adaptée aux données au lieu d’essayer d’en calculer le total à l’avance.
Obtenir la longueur de plusieurs objets avec map()
Pour appliquer len() à plusieurs objets qui ont une longueur, passez cette fonction à map(). En Python 3, map() renvoie un itérateur. Entourez-le donc de list() si vous voulez consulter et conserver ensemble tous les décomptes obtenus :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
objects = [[1, 2, 3], ("a", "b"), "Python"]
lengths = list(map(len, objects))
print(lengths)
La liste obtenue contient un décompte pour chaque objet d’entrée, dans le même ordre. Chaque objet de objects doit accepter len() ; la présence d’un itérateur sans longueur empêchera de produire tous les décomptes demandés. Si vous ne devez traiter chaque décompte qu’une seule fois, vous pouvez parcourir directement map(len, objects) sans construire de liste. Utilisez la forme avec une liste si vous devez afficher, indexer ou réutiliser l’ensemble des décomptes.