Skip to content

Chaîne maximale

On compare les mots en utilisant l'ordre du dictionnaire (ou ordre alphabétique). Notre fonction de recherche du maximum semble bien fonctionner dans le code ci-dessous puisque l'on obtient "diable" comme attendu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def max_binaire(a,b):
    """
    a et b sont deux variables de valeurs comparables.
    La fonction renvoie  la plus grande des deux.
    """
    if a > b:
        return a
    else:
        return b

def max_tableau(tab):
    """
    tab est une liste d'éléments comparables.
    La fonction renvoie l'élément le plus grand.
    """
    m = tab[0]
    for x in tab:
        m = max_binaire(m,x)
    return m


if __name__ == '__main__':

    L = ["abaque", "ancre", "barque", "cancre",  "diable", "animal", "caramel"]
    m = max_tableau(L)
    print(m)

Exercice 1

Remplacer "diable" par "Diable". Quel est maintenant le maximum? Avez-vous une explication?

Nouveau max

Avec le code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def max_binaire(a,b):
    """
    a et b sont deux variables de valeurs comparables.
    La fonction renvoie  la plus grande des deux.
    """
    if a > b:
        return a
    else:
        return b

def max_tableau(tab):
    """
    tab est une liste d'éléments comparables.
    La fonction renvoie l'élément le plus grand.
    """
    m = tab[0]
    for x in tab:
        m = max_binaire(m,x)
    return m


if __name__ == '__main__':

    L = ["abaque", "ancre", "barque", "cancre",  "Diable", "animal", "caramel"]
    m = max_tableau(L)
    print(m)

On obtient caramel comme maximum.

Une explication

Le code suivant:

1
2
>>> 'Z' < 'a'
True

montre que 'Z' est avant 'a'. Faites quelques tests. On a en fait:

'A' < 'B' < ... < 'Z' < 'a' < 'b' < ... < 'z'

Les majuscules sont donc inférieures à toutes les minuscules. Ceci explique le nouveau maximum de la liste L.

Et 'Diable' est même maintenant le minimum:

1
2
3
>>> L = ["abaque", "ancre", "barque", "cancre",  "Diable", "animal", "caramel"]
>>> min(L)
'Diable'

Exercice 2

Modifier le code précédent pour que l'on ait un classement des mots dans lequel chaque majuscule est considérée comme "égale" à la minuscule correspondante.

Vérifier que la liste L = ["abaque", "ancre", "barque", "cancre", "Diable", "animal", "caramel"] a bien alors 'Diable' pour valeur maximale.

Une solution

Il suffit de comparer les mots écrits uniquement en minuscules. Pour cela, on a ici écrit une fonction transformant un mot en ce même mot mais ne comportant que des minuscules.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def passage_en_minuscules(mot):
    """
    mot est de type str, mot est constitué de lettres de 
    l'alphabet majuscules ou minuscules.
    La fonction renvoie le mot en minuscules.
    Remarque: on pourra compléter cette fonction en traitant les lettres
    accentuées...
    """
    dico = {}
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(26):
        dico[ALPHABET[i]] =  alphabet[i]

    mot_minuscule = ''
    for lettre in mot:
        if lettre in ALPHABET:
            mot_minuscule += dico[lettre]
        else:
            mot_minuscule += lettre
    return mot_minuscule


def max_binaire(a,b):
    """
    a et b sont deux variables de type str.
    La fonction renvoie  la plus grande des deux, une majuscule
    étant considérée comme identique à sa minuscule.
    """
    a_minuscule = passage_en_minuscules(a)
    b_minuscule = passage_en_minuscules(b)
    if a_minuscule > b_minuscule:
        return a
    else:
        return b

def max_tableau(tab):
    """
    tab est une liste d'éléments comparables.
    La fonction renvoie l'élément le plus grand.
    """
    m = tab[0]
    for x in tab:
        m = max_binaire(m,x)
    return m


if __name__ == '__main__':

    L = ["abaque", "ancre", "barque", "cancre",  "Diable", "animal", "caramel"]
    m = max_tableau(L)
    print(m)

Note

La fonction renvoyant le mot correspondant en minuscules est en fait déjà prédéfinie en python. Consultez cette page de la documentation python. Et ce passage pour le passage en majuscules.

Mini projet

Ecrire une fonction renvoyant le maximum d'une liste de mots sachant que l'on doit avoir:

'A' < 'a' < 'B' < 'b' < 'C' < 'c' < ... < 'Z' < 'z'.