XD blog

blog page

ensae, exercice, programmation, python


2013-12-15 Quelques exercices de préparation à l'examen (5)

Lorsqu'on cherche un élément dans un tableau, c'est généralement pour retrouver sa position. Supposons maintenant que cet élément soit présent en plusieurs exemplaires et qu'on veuille toutes les positions où il est présent.

def positions(liste, element) :
    ...
    return une liste
    
l = [ 4,3,3,6,4,3 ]
print ( positions(l, 3) ) # affiche [1,2,5]

Dans un second temps, on veut transformer la liste l en un dictionnaire de sorte que la fonction positions ne contienne plus de boucle. Quelle est la solution la plus rapide ?

Solution proposée

La seule différence avec une recherche classique est que, même après avoir trouvé le premier élément, il faut continuer la recherche pour être sûr de trouver toutes les positions.

def positions(liste, element) :
    positions = [ ]
    for i,el in enumerate(liste) :
        if el == element : 
            positions.append(i)
    return positions
    
l = [ 4,3,3,6,4,3 ]
print ( positions(l, 3) ) # affiche [1,2,5]

On peut écrire la fonction en une seule ligne :

def positions(liste, element) :
    return [ i for i,el in enumerate(liste) if el == element ]

Un dictionnaire permet d'associer n'importe quelle valeur à une clé. L'objectif est ici de pouvoir retrouver toutes les positions d'un élément dans la liste d'origine (les valeurs) à cet élément (les clés). C'est ce que fait la fonction transformation qui suit :

def transformation(liste) :    
    dictionnaire = { }
    for i,el in enumerate(liste) :
        if el in dictionnaire : 
            dictionnaire[el].append(i)
        else :
            dictionnaire[el] = [ i ]
    return dictionnaire
            
l = [ 4,3,3,6,4,3 ]
d = transformation(l)
print ( d[3] ) 

Les positions de l'élément 3 dans la liste d'origine est la valeur associée à l'élément 3 dans le dictionnare d.

Pour aller plus loin

Le module itertools propose diverses fonctions qui manipulent les itérateurs selon une logique qui n'est pas loin de celle du langage SQL ou de la programmation fonctionnelle.

import itertools
def transformation(liste) :    
    lpos = [ (v,i) for i,v in enumerate(liste) ]
    d = { k: [ e[1] for e in v ]  for k,v in itertools.groupby (sorted(lpos), key=lambda x : x[0] )  }
    return d

<-- -->

Xavier Dupré