Les types construits : les tableaux (liste en python)

Définition

Tableau

Un tableau est une séquence mutable.

type list en Python

Une liste en Python est une séquence mutable de longueur variable.

Construire les objets list

On peut appliquer aux listes toutes les méthodes, fonctions et opérations des tuples.

une liste est définie à l'aide de crochets.

Pour initialiser en mémoire une liste vide on écrira : l=[]

  • Une liste est un objet mutable : on peut réaffecter ses éléments, ou en ajouter.
  • Tester les exemples suivants :

    liste=[5,4,2,8,"moto"]
    liste.append(35) # Ajout d'un élément à la fin de la liste
    print(liste) # print est utilisée à des fins d'observation de code
    
    liste[2]= 5 # Modification de l'élément d'indice 2
    
    print(liste)
    
    # reprendre les exemples du dessus avec un tuple
    
    tup=(1,4,9,7,"moto",4.5)
    
    # Vous allez rencontrer des messages d'erreur
    
    

    Création en extension

    La méthode append permet d'ajouter à la fin d'une liste existante un élément. On écrira :

    l.append(element_a_ajouter)
    liste=[3,8,"mot",True]
    
    liste2=[] # Création d'une liste vide
    liste2.append(4)
    
    # Afficher la liste2
    	

    Création en compréhension

    liste=[3,8,"mot",True]
    liste1=[2*x for x in range(10)]
    liste2=[2*x+1 for x in range(10)]
    liste3=[x**2 for x in range(10)]
    import math
    liste4=[math.sqrt(x) for x in liste3]
    
    # Afficher les différentes listes
    	
    *

    Dans cet exercice, vous devez écrire deux scripts Python qui créent la liste des entiers de 0 à 10000 de deux méthodes différentes :

    1. en extension
    2. en compréhension
    *
    1. Créer en compréhension une liste qui contienne les nombres pairs inférieurs à 10000.
    2. Créer en compréhension une liste qui contienne les nombres impairs inférieurs à 10000.

    Tableaux et fonctions

    Tester les exemples suivants :

    def test(a :list)->list :
    		return [x**2 for x in a if x>0],[x for x in a if x>10]
    a=[-4,-3,-2,0,1,5,9,11]
    
    		
    1. Décrire le type du retour de la fonction.
    2. Expliquer ce que fait cette fonction.

    Code de déblocage de la correction :

    Résumé des opérations et des méthodes

    Opérations/méthodes Description
    Méthodes et opérations communes aux listes et tuples.
    x in s Renvoie True si un élément s est égale à x, False sinon
    x not in s Renvoie True si aucun un élément de s n'est égale à x, False sinon
    len(s) Renvoie le nombre d'éléments de s
    s == s1 Renvoie True si s et s1 sont de même type, ont la même longueur,et ont des éléments égaux deux à deux.
    s[i] Renvoie l'élément d'indice i de s. Le premier élément a pour indice 0.
    s[i:j] Renvoie une partie de l'indice i à j non inclus
    s.index(x) Renvoie l'indice de la première apparition de x dans s
    s.count(x) Renvoie le nombre d'apparitions de x dans s
    s+t Renvoie une nouvelle séquence concaténation de s et t.
    n*t Renvoie une nouvelle séquence composée de la concaténation de t avec lui même n fois.
    Méthodes et opérations applicables aux listes (mais pas aux tuples).
    s.append(x) Ajoute l'élément x à la fin de la liste s.
    s[i] = x Modifie la liste et affecte la valeur x à la case d'indice i. Attention, cette case doit exister.
    s.insert(i,v) Insère l'élément x dans s à l'indice i . Cette méthode décale les indices suivants.
    s.remove(x) Supprime de la liste le premier élément dont la valeur est égale à x
    s.pop(i) Enlève de la liste l'élément à la position i et renvoie sa valeur. En l'absence de i, c'est le dernier élément qui est supprimé et renvoyé
    s.sort() Modifie la liste s en la triant
    s.reverse() Modifie la liste en inversant l'ordre des éléments de s
    *
    # -*- coding: utf-8 -*-
    import random 
    
    liste=[random.randint(1,6) for i in range(1000)] # Comprendre la construction de cette liste
    

    Ecrire un script Python qui renvoie une liste contenant le nombre de 1,2,3,4,5 et 6. (on utilisera la méthode count.)

    Code de déblocage de la correction :

    Ecrire une fonction "count" sans "count"

    1. Ecrire une fonction compter(element,liste) qui a pour arguments un entier (element) et une liste d'entiers (liste) qui renvoie le nombre d'occurrence de élément dans liste.
    2. Utiliser la fonction compter pour refaire l'exercice précédent.
    3. Prolongement possible : remplacer element par une liste d'éléments dans les arguments de la fonction compter.

    Code de déblocage de la correction :

    Les tableaux de tableaux

    Les éléments d'un tableau peuvent être également un tableau. Ce type d'objet rappelle un objet mathématiques que vous verrez plus tard qui s'appelle une matrice. Cet objet est utilisé dans de nombreux domaines, notamment dans le traitement des images. Une image est une matrice de pixels.

    Matrices

    On appelle matrice un tableau de tableaux dont chaque tableau à la même longueur.

    Chaque élément d'une matrice A est noté $a_{i,j}$ où $i$ est le numéro de ligne et $j$ le numéro de colonne.

    On représente une matrice de taille n,m en mathématiques ainsi :

    $A = \begin{pmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & a_{m,2} & \cdots & a_{m,n} \end{pmatrix}$

    En Python, une matrice est une liste de listes de même longueur.

    Pour accéder à un élément organisé en liste de liste, on utilise une notation avec un double crochets. Le premier indice pointe la ligne et le deuxième indice pointe la colonne.

    Si notre matrice contient n listes de m éléments on peux la voir ainsi :

    $List= \begin{pmatrix} List[0][0] & List[0][1] & \cdots & List[0][n-1] \\ List[1][0] & List[1][1] & \cdots & List[1][n-1] \\ \vdots & \vdots & \ddots & \vdots \\ List[m-1][0] & List[m-1][1] & \cdots & List[m-1][n-1] \end{pmatrix}$

    Pour accéder à l'élément j de la ième liste de L on écrira :

    
    L[i][j]
    

    L=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

    Ici , L[1][2]=7

    *
    L=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]

    Le premier élément de la liste L est la liste [1,2,3,4], pour l'afficher on écrit : L[0].

    Le troisième élément de ce L[0] est 3, pour y accéder nous utiliserons L[0][2]

    1. Afficher le quatrième élément du deuxième élément de la liste.
    2. Afficher le deuxième élément du troisième élément de la liste.
    3. Afficher l'élément indexé 0 du deuxième élément de la liste.
    4. Afficher L[2][3].
    5. Ajouter la valeur 26 à la deuxième liste. L est-elle encore une matrice?

    Code de déblocage de la correction :

    On peux se servir de données structurées en liste de listes sans que ce soit des matrices.

    Ecrire une fonction matriceAlea(n:int,m:int)->list Python qui renvoie une matrice à n lignes et m colonnes d'entiers aléatoires entre 0 et 100.

    Code de déblocage de la correction :

    Exercices

    Le but de cet exercice est de représenter un jeu de 32 cartes.

    Un jeu de 32 cartes est composé de :

    1. Modélisation du problème.
      1. Comment modéliser une carte en Python?
      2. Comment modéliser un jeu de cartes?

      Code de déblocage de la correction :

    2. Implémentation en Python.

      Le but est d'implémenter un jeu de 32 cartes et se doter de fonctions qui permettent interagir avec ce jeu.

        Lorsque vous écrivez des fonctions :
      • Il faut typer vos fonctions. Exemple : creation_jeu32(couleur:tuple, valeur32:tuple)->list
      • Il faut écrire une aide explicative docstring, entre " ", ou entre """ """" (si l'aide fait plusieurs lignes).
      1. Créer une fonction creation_jeu32(couleur:tuple, valeur32:tuple)->list qui retourne une liste de 32 cartes.
      2. Vérifier que le jeu possède 32 cartes
      3. On veut pouvoir mélanger le jeu de 32 cartes. Il existe une fonction "shuffle(liste)" qui mélange les éléments d'une liste. Ecrire une fonction melange(jeu:list)->list qui renvoie le jeu de cartes mélangé.
      4. On veut pouvoir tirer une carte au hasard du jeu. Si le jeu est mélangé, cela peut être la première carte. Il faut penser à retirer la carte du jeu. carte_hasard(jeu:list)->tuple
      5. On veut pouvoir créer une "main" de 5 cartes. Une main signifie un ensemble de cartes. Ecrire une fonction main(nombre_cartes: int,jeu:list)->list: qui renvoie une main formée du nombre de cartes. Il faut penser à retirer la main créée du jeu de 32 cartes.
    3. Code de déblocage de la correction :

    4. Vers une autre structure de données construites.

      On veut pouvoir comparer des cartes pour réaliser par exemple des jeux.

      1. Modélisation
        1. Comment modéliser la "force" d'une carte?
        2. Comment modéliser le jeu de cartes avec la force de chaque carte?
      2. Implémentation en Python
        1. Ecrire une fonction force(carte:tuple)->int: qui renvoie la "force" de la carte.
        2. Ecrire une fonction jeu_force(jeu) qui renvoie le jeu des cartes associées à leur force .
        3. On veut comparer deux cartes. Ecrire une fonction en Python compare(carte1:tuple,carte2:tuple,jeu_force:dict)->tuple qui renvoie la carte avec la force la plus élevée.
        4. Inventer une notion de distance entre deux cartes. Ecrire une fonction distance(carte1:tuple,carte2:tuple)->int qui renvoie la "distance" entre deux cartes.

    Code de déblocage de la correction :

    Le prolongement de cette activité est la création d'un jeu (bataille, rami, blackjack, poker, pyramide, etc.). La création d'un jeu pourra être développée dans le cadre de votre projet.

    Faire une recherche sur le web sur la notion de carré magique. Un carré magique d'ordre 3 est une matrice de 3 lignes et trois colonnes dont la somme des lignes, des colonnes et des diagonales fait le même nombre.

    L=[	[2,7,6],
    	[9,5,1],
    	[4,3,8]]
    	

    Ecrire un script Python qui vérifie que ce carré est magique. Le prolongement de cet exercice est la recherche de carrés magiques à partir de carrés à compléter.

    Code de déblocage de la correction :

    Python considère une phrase comme une séquence. Vous pouvez réaliser des essais avec cette citation célèbre du philosophe Confusius : "Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions." De quelle type de séquence se rapproche-t-on? De la liste et/ou du tuple ? Faire des tests à partir de vos connaissances en python.

    # -*- coding: utf-8 -*-
    citation="Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions."
    
    # Quelques tests à faire :
    
    citation[3]
    citation[4]='z'
    citation.append('!')
    
    # En chercher d'autres 
    
    
    

    En utilisant la méthode count(elt), compter le nombre de 'a' dans la citation, le nombre de 'e', le nombre de voyelles, etc.

    Code de déblocage de la correction :

    Il existe pour les listes des méthodes très intéressantes dans le traitement des chaînes de caractères. Ce sont les méthodes split() et join(). Observer le code proposé et réaliser les affichages des listes créées. Penser à également utiliser la commande type(variables) afin de vérifier le type des variables créées.

    En utilisant ces principes, comment faire pour créer une liste de mots à partir de la chaine de caractères suivante : chaine="un,deux,trois,quatre,cinq" ?

    Code de déblocage de la correction :

    ****

    Extraire des groupes aléatoires.

    L'objectif est de créer une fonction groupe(taille,nom_csv) qui prend pour argument un entier : taille correspondant à la taille des groupes voulus et une chaine de caractère nom_csv correspondant au nom du fichier csv qui renvoie la répartition des groupes à la bonne taille de manière aléatoire.

    Le matériel nécessaire se compose d'un fichier csv téléchargeable ici

    Chaque individu possède trois attribut Prénom, Nom, Race

    Les individus sont des "peaux vertes" constitués d'orques et de gobelins.

    Quelques aides à la réalisation de ce travail :

    Code de déblocage de la correction :

    Prolongement possible :

    1. réécrire la fonction précédente qui ajoute un numero de groupe à chaque groupe.
    2. Code de déblocage de la correction :

    3. faire en sorte de réécrire un csv avec la listes des élèves ave leur numéro de groupe.

    Code de déblocage de la correction :