Dictionnaireordonnee.py

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Python — POO
Objet Dictionnaire ordonné (classe maison)

Implémentation d'un dictionnaire ordonné sous forme de classe Python conservant l'ordre d'insertion des clés, avec surcharge des méthodes spéciales (__getitem__, __setitem__, __iter__...).

class DictionnaireOrdonne:
    def __init__(self, base={}, **donnees):
        self._cles = []
        self._valeurs = []
        if type(base) not in (dict, DictionnaireOrdonne):
            raise TypeError()
        
        for cle in base:
            self[cle] = base[cle]
        
        for cle in donnees:
            self[cle] = donnees[cle]
            
    def __repr__(self):
        chaine = "{"
        premier_passage = True
        for cle, valeur in self.items():
            if not premier_passage:
                chaine += ", "
            else:
                premier_passage = False
            chaine += repr(cle) + ": " + repr(valeur)
        chaine += "}"
        return chaine
    
    def __str__(self):
        return repr(self)
    
    def __len__(self):
        return len(self._cles)
    
    def __contains__(self, cle):
        return cle in self._cles
    
    def __getitem__(self, cle):
        if cle not in self._cles:
            raise KeyError("La cle {0} ne se trouve pas dans le dico".format(cle))
        else:
            indice = self._cles.index(cle)
            return self._valeurs[indice]
        
    def __setitem__(self, cle, valeur):
        if cle in self._cles:
            indice = self._cles.index(cle)
            self._valeurs[indice] = valeur
        else:
            self._cles.append(cle)
            self._valeurs.append(valeur)
            
    def __delitem__(self, cle):
        if cle not in self._cles:
            raise KeyError("La cle {0} ne se trouve pas dans le dico".format(cle))
        else:
            indice = self._cles.index(cle)
            del self._cles[indice]
            del self._valeurs[indice]
        
    def __iter__(self):
        return iter(self._cles)
    
    def __add__(self, autre_objet):
        if type(autre_objet) is not type(self):
            raise TypeError("Impossible de concatener {0} et {1}".format(type(self), type(autre_objet)))
        else:
            nouveau = DictionnaireOrdonne()
            for cle, valeur in self.items():
                nouveau[cle] = valeur
                
            for cle, valeur in autre_objet.items():
                nouveau[cle] = valeur
            return nouveau
    
    def items(self):
        for i, cle in enumerate(self._cles):
            valeur = self._valeurs[i]
            yield (cle, valeur)
        
    def keys(self):
        return list(self._cles)
    
    def values(self):
        return list(self._valeurs)
    
    def reverse(self):
        cles = []
        valeurs = []
        
        for cle, valeur in self.items():
            cles.insert(0, cle)
            valeurs.insert(0, valeur)
        self._cles = cles
        self._valeurs = valeurs
        
    def sort(self):
        cles_triees = sorted(self._cles)
        valeurs = []
        for cle in cles_triees:
            valeur = self[cle]
            valeurs.append(valeur)
        
        self._cles = cles_triees
        self._valeurs = valeurs

Voir aussi