Python list-tuple-dict

Identification

Infoforall

5 - Les types construits


Nous avons vu les types de données et le moyen de les stocker dans des variables.

Reste un problème : si vous avez besoin de stocker 100 données, il va vous falloir 100 variables...

Nous allons voir comment créer des sortes de variables-conteneurs à données : nous pourront ainsi stocker 100 données dans une seule variable. C'est mieux !

Vous allez voir par exemple comment stocker les notes de 30 élèves d'une classe et comment récupérer facilement la note de l'élève numéro 12 : il a eu 0 :

>>> notes = [2, 13, 18, 13, 0, 18, 1, 4, 10, 13, 12, 17, 0, 20, 15, 16, 10, 6, 16, 18, 19, 17, 4, 6, 15, 18, 3, 12, 1, 6] >>> notes[12] 0

Vous allez aussi comprendre qu'en informatique on commence à compter à partir de 0 et pas à partir de 1 (voir ci-dessus...).

Dernière remarque : vous avez déjà travaillé avec un type construit puisqu'un string n'est rien d'autres qu'une structure qui contient plusieurs caractères.

Logiciel nécessaire pour l'activité : Thonny

Evaluation ✎ et ✌ : questions 02-04

Documents de cours : open document ou pdf

Résumé : Version HTML ou fond blanc ou ou PDF (couleur ou gris)

1 - Cours : Les types construits

Cette partie contient uniquement l'ensemble des bouts de cours.

Vous pouvez passer à la suite si vous êtes en train de faire l'activité en autonomie : les bouts de cours à connaître apparaitront au fur et à mesure des exercices.

Tableaux statiques

1 - Définition d'un tableau statique

Un tableau statique est un tableau

  1. comportant un nombre de cases fixé à la création et
  2. dont chaque case contient le même type de données.

On trouve donc des tableaux statiques d'integers, des tableaux statiques de floats, des tableaux statiques de strings et même des tableaux statiques de tableaux statiques.

Les cases sont identifiées par un numéro qu'on nomme souvent indice (index en anglais).

Voici deux exemples de tableaux 

Un tableau de caractéres de 3 cases (indices 0-1-2) 

Indice 0 1 2
Elément 'A' 'B' 'C'

Un tableau de flottants de 4 cases (indices 0-1-2-3) :

Indice 0 1 2 3
Elément 5.89 12.56 15.89 5.0

Notez bien que la première case n'est pas la case d'indice 1 mais la case d'indice 0.

Les indices disponibles dans un tableau de 20 cases vont donc de 0 à 19 uniquement.

2 - Déclaration d'un tableau statique avec la syntaxe de Python

On peut enregistrer une séquence de données dans un tableau statique en utilisant la syntaxe suivante :

  • un crochet [ en ouverture,
  • un crochet ] en fermeture et
  • des virgules pour séparer les valeurs.
Exemple avec nos quatre notes d'élèves :

>>> notes = [20, 8, 18, 12]

Type en Python

Les tableaux statiques sont implémentés en Python sous forme d'une structure de données dont le type se nomme list.

>>> notes = [20, 8, 18, 12] >>> type(notes) <class 'list'>

On notera que le type list de Python n'est pas un vrai tableau statique. Il permet de faire beaucoup plus de choses qu'un tableau statique :

  • les cases peuvent contenir des données de types différents,
  • on peut créer ou supprimer des cases.

Nous n'utiliserons néanmoins pas (ou très peu) ses propriétés en 1er pour nous focaliser sur la notion de tableau statique (nombre fixe de cases et même type de données dans toutes les cases).

3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait l'indice en tapant simplement le nom de la variable-tableau suivi de crochets et du numéro d'indice voulu.

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> notes[0] 20 >>> notes[1] 8 >>> notes[2] 18 >>> notes[3] 12 >>> notes[4] IndexError: list index out of range

Comme vous le voyez, on peut facilement connaître la note d'un élève dont on connait l'indice.

4 - Déterminer la longueur d'un tableau

La longueur d'un tableau correspond au nombre de "cases" du tableau.

Comment connaître le nombre de cases d'un tableau ? Comme avec les strings tout simplement : on utilise la fonction native len().

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> len(notes) 4

Comme on voit qu'il y a 4 notes, on sait alors qu'on peut demander des indices allant de 0 à ...3.

5 - Modifier une case d'un tableau

Les tableaux statiques ont un désavantage : en théorie, chaque case doit contenir le même type d'éléments.

En Python, ils ont néanmoins un avantage majeur : on peut modifier le contenu des cases après la création. On dit que les tableaux statiques sont muables.

Pour cela, il suffit de faire une nouvelle affectation de valeur sur la case correspondante.

Imaginons qu'on ai oublié des points à Bob (l'élève d'indice 1) : il n'a pas 8 mais 11 finalement. Voici comment nous pourrions modifier le tableau APRES création

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> notes[1] = 11 >>> notes [20, 11, 18, 12]
Signatures sur les "tableaux"

On notera que la concaténation et la répétition de tableaux existent en Python.

Les signatures suivantes sont donc valides :

list + list -> list

list * int -> list

int * list -> list

>>> [10, 20] + [5, 30] [10, 20, 5, 30] >>> [10] * 3 [10, 10, 10] >>> 3 * [10] [10, 10, 10]

n-uplets (tuples)

1 - Définition d'un n-uplet

Un n-uplet est une séquence ordonnée d'éléments de n éléments où tous les éléments peuvent avoir un type différent, ou pas.

Les cases sont identifiées par un numéro qu'on nomme souvent indice (index en anglais).

Voici deux exemples de n-uplets 

Un 2-uplet (couple) dont les indices sont 0-1 

Indice 0 1
Elément 'DS' 18

Un 4-uplet (quadruplet) dont les indices sont 0-1-2-3 :

Indice 0 1 2 3
Elément "In Bordeland" "Alice" 18 True

En anglais, uplet se dit tuple. On rencontre souvent même dans la documentation française la dénomination tuple pour désigner un n-uplet (ou p-uplet, k-uplet...)

Notez bien que la première case n'est pas la case d'indice 1 mais la case d'indice 0.

Les indices disponibles dans un 20-uplet vont donc de 0 à 19 uniquement.

2 - Déclaration d'un n-uplet avec la syntaxe de Python

On peut enregistrer une séquence de données dans un n-uplet en utilisant la syntaxe suivante :

  • une parenthèse ( en ouverture,
  • une parenthèse ) en fermeture et
  • des virgules pour séparer les valeurs.
Exemple avec notre individu :

>>> eleve = ("In Bordeland", "Alice", 18, True)

Type en Python

Les n-uplets sont implémentés en Python sous forme d'une structure de données dont le type se nomme tuple.

>>> eleve = ("In Bordeland", "Alice", 18, True) >>> type(eleve) <class 'tuple'>
3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait l'indice en tapant simplement le nom de la variable-tuple suivi de crochets et du numéro d'indice voulu.

Attention, on place bien des crochets même s'il s'agit d'un tuple : les parenthèses ne servent que lors de la déclaration.

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[0] 'In Bordeland' >>> eleve[1] 'Alice' >>> eleve[2] 18 >>> eleve[3] True >>> eleve[4] IndexError: tuple index out of range

Comme vous le voyez, on peut facilement connaître une information sur un élève si on connait l'indice de cette information.

4 - Déterminer la longueur d'un tuple

La longueur d'un n-uplet correspond au nombre de "cases" du n-uplet.

Comment connaître le nombre de cases d'un n-uplet ? Comme avec les strings et les tableaux tout simplement : on utilise la fonction native len().

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> len(eleve) 4

4 éléments, on sait alors qu'on peut demander des indices allant de 0 à 3.

5 - Modifier une case d'un n-uplet

En Python, le type tuple n'est pas modifiable après création.

On dit que le type tuple est immuable : on ne peut pas modifier le contenu du tuple après création.

Imaginons qu'on veuille mettre les informations sur Alice à jour le jour de ses 19 ans :

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[2] = 19 TypeError: 'tuple' object does not support item assignment

Nous détaillerons précisement ce que veut dire immuable et muable dans d'autres activités.

Attention, immuable ne veut pas dire que c'est une constante. On peut modifier la variable dans sa totalité : il faut recréer un nouveau tuple qui porte le même nom, c'est tout.

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[2] 18 >>> eleve = ("In Bordeland", "Alice", 19, True) >>> eleve[2] 19

Immuable veut dire qu'on ne peut pas modifier une partie du contenu sans recréer tout le contenu.

Signatures sur les n-uplets

On notera que la concaténation et la répétition de n-uplets existent en Python.

Les signatures suivantes sont donc valides :

tuple + tuple -> tuple

tuple * int -> tuple

int * tuple -> tuple

>>> (10, 20) + (5, 30) (10, 20, 5, 30) >>> (10, ) * 3 (10, 10, 10) >>> 3 * (10, ) (10, 10, 10)

Vous noterez sur les deux derniers exemples que nous sommes obligés de rajouter au moins une virgule pour faire comprendre à Python que nous parlons d'un 1-uplet contenant 10 et pas simplement de 10 entre parenthèses. C'est la syntaxe choisi pour séparer les deux cas, rien à comprendre, c'est comme cela.

dictionnaires

1 - Définition d'un dictionnaire

Un dictionnaire se nomme également tableau associatif.

Les cases sont identifiées non pas par un numéro mais par un identifiant quelconque qu'on nomme une clé (key en anglais).

Voici un dictionnaire décrivant le contenu d'un sac exemple 

Clé "Cahier" "Crayon 4 couleurs" "Calculatrice"
Valeur 3 "usé" "neuve"
2 - Déclaration d'un dictionnaire en Python
  • Les éléments délimitateurs sont les accolades {}.
  • On fournit un couple (cle, valeur) en utilisant la syntaxe Python suivante : cle: valeur.
  • Chaque couple (clé-valeur) du dictionnaire est séparé des autres par une virgule.

Exemple avec le dictionnaire décrivant le contenu de notre sac imaginaire :

1
sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"}

Pour plus de clarté, on pourrait taper ceci :

1 2 3 4 5
sac = { "Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve" }

Type en Python

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> type(sac) <class 'dict'>

Comme vous pouvez le voir, le type de l'objet que nous utilisons pour gérer les dictionnaires (dictionary en anglais) dans Python se nomme dict.

3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait la clé en tapant simplement le nom de la variable-dictionnaire suivi de crochets et de la clé voulue.

Attention, on place bien des crochets même s'il s'agit d'un dictionnaire : les accolades ne servent que lors de la déclaration.

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> sac["Cahier"] 3 >>> sac["Crayon 4 couleurs"] 'usé' >>> sac["Calculatrice"] 'neuve' >>> sac["dm pour aujourd'hui"] KeyError: "dm pour aujourd'hui"

Comme vous le voyez, on peut facilement connaître une information si on connait la clé de cette information.

4 - Déterminer la longueur d'un dictionnaire

On peut utiliser la fonction native len() pour obtenir le nombre de couples (clé, valeur) enregistrés dans un dictionnaire.

Exemple

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> nbr = len(sac) >>> nbr 3

Le dictionnaire contient bien 3 couples (clé, valeur), et pas 6 éléments indépendants.

5 - Rajouter ou modifier un couple (clé, valeur)

Le type dict de Python est muable.

On peut facilement rajouter des couples (clé, valeur) dans un dictionnaire, contrairement aux tableaux statiques dans lesquels le nombre de cases est fixé à la création.

Par contre, attention à la syntaxe : on utilise bien les crochets et pas des accolades !

Exemple

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> sac {'Cahier': 3, 'Crayon 4 couleurs': 'usé', 'Calculatrice': 'neuve'} >>> sac['paquet de biscuits'] = 12 >>> sac {'Cahier': 3, 'Crayon 4 couleurs': 'usé', 'Calculatrice': 'neuve', 'paquet de biscuits': 12} >>> nbr = len(sac) >>> nbr 4

Le dictionnaire contient bien maintenant 4 couples (clé, valeur).

Signatures sur les dictionnaires

Pas de concaténation ou de répétition sur les dictionnaires..

Il n'existe donc pas de signatures valides comportant l'opérateur + ou * et intégrant le type dict.

2 - Tableau statique

Imaginons qu'on veuille stocker des notes d'élèves sur un DS. Prenons une classe de 4 élèves pour l'exemple (un exemple très réaliste...) 

Nous pourrions stocker les notes d'Alice, Bob, Clark et Dolores de cette façon :

1 2 3 4
alice = 20 bob = 8 clark = 18 dolores = 12

Mais avec une trentaine d'élèves par classe, ça devient vite lassant...

1 - Définition d'un tableau statique

Un tableau statique est un tableau

  1. comportant un nombre de cases fixé à la création et
  2. dont chaque case contient le même type de données.

On trouve donc des tableaux statiques d'integers, des tableaux statiques de floats, des tableaux statiques de strings et même des tableaux statiques de tableaux statiques.

Les cases sont identifiées par un numéro qu'on nomme souvent indice (index en anglais).

Voici deux exemples de tableaux 

Un tableau de caractéres de 3 cases (indices 0-1-2) 

Indice 0 1 2
Elément 'A' 'B' 'C'

Un tableau de flottants de 4 cases (indices 0-1-2-3) :

Indice 0 1 2 3
Elément 5.89 12.56 15.89 5.0

Notez bien que la première case n'est pas la case d'indice 1 mais la case d'indice 0.

Les indices disponibles dans un tableau de 20 cases vont donc de 0 à 19 uniquement.

2 - Déclaration d'un tableau statique avec la syntaxe de Python

On peut enregistrer une séquence de données dans un tableau statique en utilisant la syntaxe suivante :

  • un crochet [ en ouverture,
  • un crochet ] en fermeture et
  • des virgules pour séparer les valeurs.
Exemple avec nos quatre notes d'élèves :

>>> notes = [20, 8, 18, 12]

Type en Python

Les tableaux statiques sont implémentés en Python sous forme d'une structure de données dont le type se nomme list.

>>> notes = [20, 8, 18, 12] >>> type(notes) <class 'list'>

On notera que le type list de Python n'est pas un vrai tableau statique. Il permet de faire beaucoup plus de choses qu'un tableau statique :

  • les cases peuvent contenir des données de types différents,
  • on peut créer ou supprimer des cases.

Nous n'utiliserons néanmoins pas (ou très peu) ses propriétés en 1er pour nous focaliser sur la notion de tableau statique (nombre fixe de cases et même type de données dans toutes les cases).

3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait l'indice en tapant simplement le nom de la variable-tableau suivi de crochets et du numéro d'indice voulu.

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> notes[0] 20 >>> notes[1] 8 >>> notes[2] 18 >>> notes[3] 12 >>> notes[4] IndexError: list index out of range

Comme vous le voyez, on peut facilement connaître la note d'un élève dont on connait l'indice.

4 - Déterminer la longueur d'un tableau

La longueur d'un tableau correspond au nombre de "cases" du tableau.

Comment connaître le nombre de cases d'un tableau ? Comme avec les strings tout simplement : on utilise la fonction native len().

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> len(notes) 4

Comme on voit qu'il y a 4 notes, on sait alors qu'on peut demander des indices allant de 0 à ...3.

5 - Modifier une case d'un tableau

Les tableaux statiques ont un désavantage : en théorie, chaque case doit contenir le même type d'éléments.

En Python, ils ont néanmoins un avantage majeur : on peut modifier le contenu des cases après la création. On dit que les tableaux statiques sont muables.

Pour cela, il suffit de faire une nouvelle affectation de valeur sur la case correspondante.

Imaginons qu'on ai oublié 1 point à Bob (l'élève d'indice 1) : il n'a pas 8 mais 11 finalement. Voici comment nous pourrions modifier le tableau APRES création

Indice 0 1 2 3 >>> notes = [20, 8, 18, 12] >>> notes[1] = 11 >>> notes [20, 11, 18, 12]

01° Créer un programme qui stocke le tableau eleves, stocke le nombre d'élèves dans une variable nbE et stocke dans mystere le nom de l'élève d'indice 75 et dans mystere2 le nom de l'élève du 75e élève.

eleves = ["Lisa", "Scott", "Matthias", "Antoine", "Ethan", "Lucas", "Manon", "Alexandre", "Alexandre", "Kenzo", "Thomas", "Lilou", "Aurélien", "Charles", "Manon", "Francia", "Imrane", "Sarah", "Yassin", "Sofian", "Noé", "Lenny", "Matt", "Ryiad", "Yanis", "Jason", "Damien", "Antonin", "Samy", "Laurine", "Rayan", "Eliot", "Victor", "Theo", "Julien", "Benjamin", "Flavian", "Nathan", "Nassim", "Evan", "Hugo", "Quentin", "Gwennaël", "Sullyvan", "Mathias", "Yanis", "Mathis", "Simon", "Mathis", "Matthew", "Brandon", "Axelle", "Mathieu", "Stéphane", "Hadrien", "Thomas", "Anton", "Thomas", "Djason", "Lohan", "Kylian", "Corentin", "Julien", "Léa", "Laura", "Anthony", "Audrey", "Léo", "Reda", "Ayoub", "Quentin", "Maïssa", "Tanguy", "Giovanni", "Mélia", "Gwenaël", "Ismaël", "Thomas", "Victor", "Andrew", "Théo", "Florian", "Louis", "Djebrine", "Angele", "Loann", "Medhi", "Jordy", "Pierre", "Kylian"]

...CORRECTION...

1 2 3 4 5
eleves = ["Lisa", "Scott", "Matthias", "Antoine", "Ethan", "Lucas", "Manon", "Alexandre", "Alexandre", "Kenzo", "Thomas", "Lilou", "Aurélien", "Charles", "Manon", "Francia", "Imrane", "Sarah", "Yassin", "Sofian", "Noé", "Lenny", "Matt", "Ryiad", "Yanis", "Jason", "Damien", "Antonin", "Samy", "Laurine", "Rayan", "Eliot", "Victor", "Theo", "Julien", "Benjamin", "Flavian", "Nathan", "Nassim", "Evan", "Hugo", "Quentin", "Gwennaël", "Sullyvan", "Mathias", "Yanis", "Mathis", "Simon", "Mathis", "Matthew", "Brandon", "Axelle", "Mathieu", "Stéphane", "Hadrien", "Thomas", "Anton", "Thomas", "Djason", "Lohan", "Kylian", "Corentin", "Julien", "Léa", "Laura", "Anthony", "Audrey", "Léo", "Reda", "Ayoub", "Quentin", "Maïssa", "Tanguy", "Giovanni", "Mélia", "Gwenaël", "Ismaël", "Thomas", "Victor", "Andrew", "Théo", "Florian", "Louis", "Djebrine", "Angele", "Loann", "Medhi", "Jordy", "Pierre", "Kylian"] nbE = len(eleves) mystere = eleves[75] mystere2 = eleves[74]
Déclarer clairement un tableau ayant beaucoup de cases

Si le tableau ne contient que quelques cases, il est facile de comprendre ce qu'on lui fournit comme valeurs.

Pour notre tableau d'élèves, c'est plus compliqué...

Sachez qu'on peut déclarer un tableau sur plusieurs lignes et tapant sur ENTREE après chaque virgule. Exemple :

1 2 3 4 5 6 7
eleves = ["Lisa", "Scott", "Matthias", "Antoine", "Ethan", "Lucas", "Manon"]

Cela prend plus de lignes mais on comprend un peu mieux ce qu'on place où.

✎ et ✌ 02° Créer une variable cours référençant un tableau de strings de 11 cases :

  • Indice 0 : le nom de la journée d'aujourd'hui
  • Indice 1 : le nom du cours que vous avez sur 8h-9h
  • Indice 2 : le nom du cours que vous avez sur 9h-10h
  • Indice 3 : le nom du cours que vous avez sur 10h-11h
  • Indice 4 : le nom du cours que vous avez sur 11h-12h
  • Indice 5 : le nom du cours que vous avez sur 12h-13h
  • Indice 6 : le nom du cours que vous avez sur 13h-14h
  • Indice 7 : le nom du cours que vous avez sur 14h-15h
  • Indice 8 : le nom du cours que vous avez sur 15h-16h
  • Indice 9 : le nom du cours que vous avez sur 16h-17h
  • Indice 10 : le nom du cours que vous avez sur 17h-18h

Pensez à aller lire la remarque rouge juste avant la question si vous ne voulez pas que cela soit trop pénible...

Si vous n'avez pas cours sur le créneau, à vous de choisir une codification le signalant, sachant qu'on veut que ce soit un tableau de strings.

Deuxième question : que faut-il taper dans la console pour avoir le cours de 14h à 15h à partir de votre variable cours ?

Signatures sur les "tableaux"

On notera que la concaténation et la répétition de tableaux existent en Python.

Les signatures suivantes sont donc valides :

list + list -> list

list * int -> list

int * list -> list

>>> [10, 20] + [5, 30] [10, 20, 5, 30] >>> [10] * 3 [10, 10, 10] >>> 3 * [10] [10, 10, 10]

3 - Le n-uplet

La différence majeure entre un tableau et un n-uplet vient du fait qu'on peut placer des éléments de type différent dans chacune des cases.

Imaginons qu'on désire stocker des informations sur un individu :

1 2 3 4
nom = "In Borderland" prenom = "Alice" age = 18 speNSI = True

On voit bien qu'on veut stocker 2 strings, un entier et un booléen. Dans un tableau statique, ce n'est pas possible.

1 - Définition d'un n-uplet

Un n-uplet est une séquence ordonnée d'éléments de n éléments où tous les éléments peuvent avoir un type différent, ou pas.

Les cases sont identifiées par un numéro qu'on nomme souvent indice (index en anglais).

Voici deux exemples de n-uplets 

Un 2-uplet (couple) dont les indices sont 0-1 

Indice 0 1
Elément 'DS' 18

Un 4-uplet (quadruplet) dont les indices sont 0-1-2-3 :

Indice 0 1 2 3
Elément "In Bordeland" "Alice" 18 True

En anglais, uplet se dit tuple. On rencontre souvent même dans la documentation française la dénomination tuple pour désigner un n-uplet (ou p-uplet, k-uplet...)

Notez bien que la première case n'est pas la case d'indice 1 mais la case d'indice 0.

Les indices disponibles dans un 20-uplet vont donc de 0 à 19 uniquement.

2 - Déclaration d'un n-uplet avec la syntaxe de Python

On peut enregistrer une séquence de données dans un n-uplet en utilisant la syntaxe suivante :

  • une parenthèse ( en ouverture,
  • une parenthèse ) en fermeture et
  • des virgules pour séparer les valeurs.
Exemple avec notre individu :

>>> eleve = ("In Bordeland", "Alice", 18, True)

Type en Python

Les n-uplets sont implémentés en Python sous forme d'une structure de données dont le type se nomme tuple.

>>> eleve = ("In Bordeland", "Alice", 18, True) >>> type(eleve) <class 'tuple'>
3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait l'indice en tapant simplement le nom de la variable-tuple suivi de crochets et du numéro d'indice voulu.

Attention, on place bien des crochets même s'il s'agit d'un tuple : les parenthèses ne servent que lors de la déclaration.

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[0] 'In Bordeland' >>> eleve[1] 'Alice' >>> eleve[2] 18 >>> eleve[3] True >>> eleve[4] IndexError: tuple index out of range

Comme vous le voyez, on peut facilement connaître une information sur un élève si on connait l'indice de cette information.

4 - Déterminer la longueur d'un tuple

La longueur d'un n-uplet correspond au nombre de "cases" du n-uplet.

Comment connaître le nombre de cases d'un n-uplet ? Comme avec les strings et les tableaux tout simplement : on utilise la fonction native len().

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> len(eleve) 4

4 éléments, on sait alors qu'on peut demander des indices allant de 0 à 3.

5 - Modifier une case d'un n-uplet

En Python, le type tuple n'est pas modifiable après création.

On dit que le type tuple est immuable : on ne peut pas modifier le contenu du tuple après création.

Imaginons qu'on veuille mettre les informations sur Alice à jour le jour de ses 19 ans :

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[2] = 19 TypeError: 'tuple' object does not support item assignment

Nous détaillerons précisement ce que veut dire immuable et muable dans d'autres activités.

Attention, immuable ne veut pas dire que c'est une constante. On peut modifier la variable dans sa totalité : il faut recréer un nouveau tuple qui porte le même nom, c'est tout.

Indice 0 1 2 3 >>> eleve = ("In Bordeland", "Alice", 18, True) >>> eleve[2] 18 >>> eleve = ("In Bordeland", "Alice", 19, True) >>> eleve[2] 19

Immuable veut dire qu'on ne peut pas modifier une partie du contenu sans recréer tout le contenu.

03° L'encodage ASCII des caractères fait correspondre un nombre compris entre 0 et 127 à quelques caractères. Dans la mesure où la correspondance est figée, nous allons la stocker dans un tuple immuable plutôt que dans un tableau muable.

Deux questions

  1. Afficher le caractère ayant l'indice 65 en utilisant le tuple ascii ci-dessous.
  2. Trouver le message qui se cache derrière la suite d'indices 67-111-117-99-111-117.

ascii = ('\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\t', '\n', '\x0b', '\x0c', '\r', '\x0e', '\x0f', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '\x7f')

...CORRECTION...

On place ceci dans un programme et on lance pour le mettre en mémoire.

1
ascii = ('\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\t', '\n', '\x0b', '\x0c', '\r', '\x0e', '\x0f', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '\x7f')

Il suffit alors d'interroger l'interpréteur :

>>> ascii[65] 'A' >>> ascii[67] 'C' >>> ascii[111] 'o' >>> ascii[117] 'u' >>> ascii[99] 'c' >>> ascii[111] 'o' >>> ascii[117] 'u'
Signatures sur les n-uplets

On notera que la concaténation et la répétition de n-uplets existent en Python.

Les signatures suivantes sont donc valides :

tuple + tuple -> tuple

tuple * int -> tuple

int * tuple -> tuple

>>> (10, 20) + (5, 30) (10, 20, 5, 30) >>> (10, ) * 3 (10, 10, 10) >>> 3 * (10, ) (10, 10, 10)

Vous noterez sur les deux derniers exemples que nous sommes obligés de rajouter au moins une virgule pour faire comprendre à Python que nous parlons d'un 1-uplet contenant 10 et pas simplement de 10 entre parenthèses. C'est la syntaxe choisi pour séparer les deux cas, rien à comprendre, c'est comme cela.

4 - Dictionnaire

Nous avons vu pour l'instant des données structurées autour de la notion d'indice. Toutes les informations doivent être présentes et fournies dans un ordre précis.

Mais parfois, on ne connaît pas nécessairement les informations qu'on va vouloir stocker.

Imaginons un dictionnaire qui compte le nombre de fois où un mot est présent dans une phrase. Deux raisons de ne pas utiliser de tableau ou de n-uplet :

  1. Au vu du nombre de mots possibles, pas moyen de créer un tableau statique ou un n-uplet, il y aurait beaucoup trop de cases (et la majorité des cases seraient vides).
  2. Comment connaître l'indice d'un mot qu'on cherche ? Ca peut vite être long s'il faut compter depuis le début à chaque fois...

Pour toutes ces raisons, voici la nouvelle structure de données qu'on nomme un dictionnaire.

1 - Définition d'un dictionnaire

Un dictionnaire se nomme également tableau associatif.

Les cases sont identifiées non pas par un numéro mais par un identifiant quelconque qu'on nomme une clé (key en anglais).

Voici un dictionnaire décrivant le contenu d'un sac exemple 

Clé "Cahier" "Crayon 4 couleurs" "Calculatrice"
Valeur 3 "usé" "neuve"
2 - Déclaration d'un dictionnaire en Python

  • Les éléments délimitateurs sont les accolades {}.
  • On fournit un couple (cle, valeur) en utilisant la syntaxe Python suivante : cle: valeur.
  • Chaque couple (clé-valeur) du dictionnaire est séparé des autres par une virgule.

Exemple avec le dictionnaire décrivant le contenu de notre sac imaginaire :

1
sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"}

Pour plus de clarté, on pourrait taper ceci :

1 2 3 4 5
sac = { "Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve" }

Type en Python

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> type(sac) <class 'dict'>

Comme vous pouvez le voir, le type de l'objet que nous utilisons pour gérer les dictionnaires (dictionary en anglais) dans Python se nomme dict.

3 - Lecture avec la syntaxe Python

On peut accéder à la valeur stockée dans une case dont on connait la clé en tapant simplement le nom de la variable-dictionnaire suivi de crochets et de la clé voulue.

Attention, on place bien des crochets même s'il s'agit d'un dictionnaire : les accolades ne servent que lors de la déclaration.

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> sac["Cahier"] 3 >>> sac["Crayon 4 couleurs"] 'usé' >>> sac["Calculatrice"] 'neuve' >>> sac["dm pour aujourd'hui"] KeyError: "dm pour aujourd'hui"

Comme vous le voyez, on peut facilement connaître une information si on connait la clé de cette information.

4 - Déterminer la longueur d'un dictionnaire

On peut utiliser la fonction native len() pour obtenir le nombre de couples (clé, valeur) enregistrés dans un dictionnaire.

Exemple

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> nbr = len(sac) >>> nbr 3

Le dictionnaire contient bien 3 couples (clé, valeur), et pas 6 éléments indépendants.

5 - Rajouter ou modifier un couple (clé, valeur)

Le type dict de Python est muable.

On peut facilement rajouter des couples (clé, valeur) dans un dictionnaire, contrairement aux tableaux statiques dans lesquels le nombre de cases est fixé à la création.

Par contre, attention à la syntaxe : on utilise bien les crochets et pas des accolades !

Exemple

>>> sac = {"Cahier": 3, "Crayon 4 couleurs": "usé", "Calculatrice": "neuve"} >>> sac {'Cahier': 3, 'Crayon 4 couleurs': 'usé', 'Calculatrice': 'neuve'} >>> sac['paquet de biscuits'] = 12 >>> sac {'Cahier': 3, 'Crayon 4 couleurs': 'usé', 'Calculatrice': 'neuve', 'paquet de biscuits': 12} >>> nbr = len(sac) >>> nbr 4

Le dictionnaire contient bien maintenant 4 couples (clé, valeur).

✎ et ✌ 04° Créer une variable cours référençant un dictionnaire de strings :

  • Les clés devront être des strings du type "10-11"
  • Les valeurs associées devront être les intitulés des cours

Pensez à utiliser une déclaration sur plusieurs lignes, avec un seul couple clé: valeur par ligne, si vous voulez que cela soit facilement compréhensible.

Si vous n'avez pas cours sur le créneau, pas la peine de créer de clés.

Que faut-il taper dans la console pour avoir le cours de 14h à 15h à partir de votre variable cours ?

Signatures sur les dictionnaires

Pas de concaténation ou de répétition sur les dictionnaires..

Il n'existe donc pas de signatures valides comportant l'opérateur + ou * et intégrant le type dict.

5 - FAQ

J'ai entendu parler de types composés ou structurés. C'est quoi ?

Des synonymes.

La notion de type construit est parfois dénommée également type structuré ou type composé.

On peut détruire une variable ?

Oui, on peut libérer la place mémoire attribuée à une variable. Pour cela, il faut utiliser le mot-clé del.

Exemple :

>>> a = 5 >>> a 5 >>> del a >>> a NameError: name 'a' is not defined

J'ai vu une notation bizarre : a += 1

Effectivement, on peut également utiliser une autre notation.

1 2
a = 10 a += 1

Cela donne ici le même résultat que ceci :

1 2
a = 10 a = a + 1

Attention, les deux façons de faire sont équivalentes ici, mais pas toujours. Evitez ces notations pour l'instant. De toutes manières, elles ne seront pas utilisées dans les sujets de NSI. Gardez la méthode n°2. C'est plus long mais c'est moins compliqué à comprendre de toutes manières.

Nous avons réussi à bien formaliser les choses en utilisant la console interactive. Mais nous ne faisons que taper des instructions qui s'exécutent immédiatement.

Nous avons vu comment stocker des informations dans des variables.

Il nous reste à voir comment stocker des instructions : créer un programme. De cette façon, nous n'aurons pas à taper les instructions. Elles seront enregistrées en mémoire.

Activité publiée le 17 09 2022
Dernière modification : 17 09 2022
Auteur : ows. h.