6.4.1 La fonction enumerate
La fonction enumerate prend en argument un objet itérable seq et elle crée un itérateur renvoyant les couples (n, x) formés des objets x successifs de seq et de leur numéro d’ordre n.
|
1 2 3 4 5 6 7 |
>>> from random import sample # on importe la fonction sample du module random >>> L = sample(range(10,100),10); L # on crée une liste de 10 nombres différents à deux chiffres. [64, 33, 98, 36, 15, 29, 21, 47, 78, 89] >>> list(enumerate(L))] # on forme la liste des couples (n, L[n]), avec n ≥ 0 [(0,64), (1,33), (2,98), (3,36), (4,15), (5,29), (6,21), (7,47), (8,78), (9,89)] >>> list(enumerate(L,start=1)) # ici, on fait débuter la numérotation à 1 [(1,64), (2,33), (3,98), (4,36), (5,15), (6,29), (7,21), (8,47), (9,78), (10,89)] |
Avec la liste L ci-dessus. Voici comment calculer la somme des kL[k], si la numérotation démarre à k = 1 :
|
1 2 3 4 |
>>> sum((n+1)*L[n] for n in range(len(L))) # sans enumerate 2932 >>> sum(n*x for (n,x) in enumerate(L,start=1)) # avec enumerate 2932 |
6.4.2 La fonction zip
La fonction zip renvoie un itérateur calculant les couples (x, y) d’éléments de même position dans deux itérables (qui peuvent très bien ne pas être de la même longueur, on s’arrête alors à la plus courte séquence) :
|
1 2 3 4 5 |
>>> s1 = range(1,10); s2 = 'abcdef' # chiffres de 1 à 9, puis lettres de a à f >>> list(zip(s1,s2)) # on zippe s1 et s2, et on convertit en liste [(1,'a'), (2,'b'), (3,'c'), (4,'d'), (5,'e'), (6,'f')] >>> list(zip(s2,s1)) # on zippe s2 et s1, et on convertit en liste [('a',1), ('b',2), ('c',3), ('d',4), ('e',5), ('f',6)] |
La fonction zip, associée à l’opérateur *, peut être utilisée pour transposer une matrice de tuples :
|
1 2 3 |
>>> a = [(1, 2, 3), (4, 5, 6)] # une liste de deux tuples de longueur 3 >>> b = list(zip(*a)); b # forme la liste transposée [(1, 4), (2, 5), (3, 6)] |
6.4.3 Les fonction any et all
La fonction any permet de savoir si l’un au moins des éléments d’un itérable est “vrai” (c’est-à-dire non nul, non vide).
La fonction all permet de savoir si tous les éléments d’un itérable sont “vrais” (c’est-à-dire non nuls, non vides).
|
1 2 3 4 5 6 7 |
>>> L = [5236,8075,9876,9503] # on forme une liste de quatre entiers >>> any(x%17 for x in L) # l'un d'eux au moins est-il non divisible par 17? True >>> all(x%17 for x in L) # tous sont-ils non divisibles par 17? False >>> [x%17 for x in L] # voici en fait la liste des restes modulo 17 [0, 0, 16, 0] |
6.4.4 La fonction reversed
La fonction reversed permet d’itérer “à l’envers” sur les valeurs d’un itérable.
|
1 2 3 4 5 |
>>> s = t = 0 >>> for n in [8,5,6,2]: s = 10*s + n # convertit la liste de chiffres en un entier >>> for n in reversed([8,5,6,2]): t = 10*t + n # même chose, mais à l'envers >>> s, t (8562, 2658) |