fiche mémo : 2.4. Listes.¶
Les listes et leurs possibilités. Inclut l'indexation, le découpage et la mutation.¶
Vincent GODARD - V1 - 13/03/2025¶
Cours Introduction à la programmation¶
Département de géographie - L3 - Université de Paris 8¶
Traduction librement (largement) inspirée de : https://www.kaggle.com/code/colinmorris/lists
Sources :
Kaggle : https://www.kaggle.com/learn
Python Tutorial : https://www.w3schools.com/python/default.asp
Cours de Python : https://python.sdv.u-paris.fr/00_avant_propos/
Téléchargement des documents nécessaires :
Dossier compressé à télécharger => (pas utile ici).
1. Listes¶¶
En Python, les listes représentent des séquences ordonnées de valeurs. Voici un exemple de création :
## Primes = nombres premiers
primes = [2, 3, 5, 7]
Nous pouvons mettre d’autres types de choses dans des listes :
planets = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune']
Nous pouvons même faire une liste de listes :
## ici hands = cartes
cartes = [
['J', 'Q', 'K'],
['2', '2', '2'],
['6', 'A', 'K'], # (La virgule après le dernier élément est facultative)
]
# (J'aurais aussi pu écrire ceci sur une seule ligne, mais la lecture peut être difficile)
cartes = [['J', 'Q', 'K'], ['2', '2', '2'], ['6', 'A', 'K']]
Une liste peut contenir un mélange de différents types de variables :
## my_favourite_things = https://www.youtube.com/watch?v=0IagRZBvLtw&ab_channel=Rodgers%26Hammerstein
my_favourite_things = [32, 'raindrops on roses', help]
# (Oui, la fonction d'aide de Python est *définitivement/certainement* l'une de mes fonctionnalités préférées)
2. Indexation¶¶
Vous pouvez accéder aux éléments individuels de la liste grâce aux crochets.
Quelle planète est la plus proche du Soleil ? Python utilise une indexation basée sur zéro, le premier élément ayant donc l'index 0.
planets[0]
Quelle est la planète suivante la plus proche ?
planets[1]
Quelle planète est la plus éloignée du Soleil ? Les éléments figurant à la fin de la liste sont accessibles par des nombres négatifs, à partir de -1 :
planets[-1]
planets[-2]
3. Découpage¶¶
Quelles sont les trois premières planètes ? Nous pouvons répondre à cette question grâce au découpage :
planets[0:3]
planets[0:3] est notre façon de demander les éléments des planets, de l'indice 0 jusqu'à l'indice 3 exclu.
Les indices de début et de fin sont facultatifs. Si j'omets l'indice de début, il est supposé être 0. Je pourrais donc réécrire l'expression ci-dessus comme suit :
planets[:3]
Si je laisse de côté l'index de fin, il est supposé correspondre à la longueur de la liste.
planets[3:]
Autrement dit, l'expression ci-dessus signifie « Donnez-moi toutes les planètes à partir de l'indice 3 ».
On peut également utiliser des indices négatifs lors du découpage :
# Toutes les planètes sauf la première et la dernière
planets [1:-1]
# Les 3 dernières planètes
planets[-3:]
4. Modification des listes¶¶
Les listes sont « mutables », ce qui signifie qu'elles peuvent être modifiées « sur place ».
Une façon de modifier une liste est de l'affecter à un index ou à une expression de coupe.
Par exemple, imaginons que nous souhaitions renommer Mars :
planets[3] = 'Malacandra'
planets
Hmm, c'est un peu long. Compensons en raccourcissant les noms des trois premières planètes.
planets[:3] = ['Mur', 'Vee', 'Ur']
print(planets)
# C'est ridicule. Redonnons-leur leurs anciens noms.
planets[:4] = ['Mercury', 'Venus', 'Earth', 'Mars',]
Expliquons cette dernière ligne de script.
# Est-ce que le remplacement a bien eu lieu ?
planets
5. Fonctions de liste¶¶
Python dispose de plusieurs fonctions utiles pour travailler avec des listes.
len donne la longueur d'une liste :
# Combien y a-t-il de planètes ?
len(planets)
sorted renvoie une version triée d'une liste :
# Les planètes classées par ordre alphabétique
sorted(planets)
sum fait ce que vous pourriez attendre :
## Sommation des nombres premiers
primes = [2, 3, 5, 7]
sum(primes)
Nous avons déjà utilisé les valeurs min et max pour obtenir le minimum ou le maximum de plusieurs arguments. Nous pouvons également transmettre un seul argument de liste.
max(primes)
6. Interlude : objets¶¶
J'ai beaucoup utilisé le terme « objet » jusqu'à présent ; vous avez peut-être même lu que tout en Python est un objet. Qu'est-ce que cela signifie ?
En bref, les objets transportent des éléments/certaines choses avec eux. On y accède grâce à la syntaxe pointée/point de Python.
Par exemple, les nombres en Python transportent une variable associée appelée imag, qui représente leur partie imaginaire. (Vous n'aurez probablement jamais besoin de l'utiliser, sauf si vous effectuez des calculs mathématiques très complexes.)
x = 12
# x est un nombre réel, donc sa partie imaginaire est 0.
print(x.imag)
# Voici comment créer un nombre complexe, au cas où vous seriez intéressé :
c = 12 + 3j
print(c.imag)
Les éléments qu'un objet transporte peuvent également inclure des fonctions. Une fonction attachée à un objet est appelée une méthode. (Les éléments non fonctionnels attachés à un objet, comme imag, sont appelés attributs.)
Par exemple, les nombres ont une méthode appelée bit_length. Là encore, on y accède par la syntaxe à points :
x.bit_length
Pour l'appeler réellement, nous ajoutons des parenthèses :
x.bit_length()
En aparté : Vous avez déjà appelé des méthodes si vous avez fait les exercices de Kaggle. Dans les cahiers d'exercices, q1, q2, q3, etc. sont tous des objets dotés de méthodes appelées check, hint et solution.
De la même manière que nous pouvons passer des fonctions à la fonction d'aide (par exemple, help(max)), nous pouvons également passer les méthodes suivantes :
help(x.bit_length)
Les exemples ci-dessus étaient totalement obscurs. Aucun des types d'objets que nous avons étudiés jusqu'à présent (nombres, fonctions, booléens) ne possède d'attributs ou de méthodes que vous utiliserez probablement un jour.
Mais il s'avère que les listes possèdent plusieurs méthodes que vous utiliserez constamment.
7. Méthodes de liste¶
list.append modifie une liste en ajoutant un élément à la fin :
# Pluton (Pluto) est une planète, bon sang !
planets.append('Pluto')
Pourquoi la cellule ci-dessus n'a-t-elle pas de résultat ? Vérifions la documentation en appelant help(planets.append).
Par ailleurs : append est une méthode utilisée par tous les objets de type liste, et pas seulement les planètes. Nous aurions donc pu appeler help(list.append). Cependant, si nous essayons d'appeler help(append), Python signalera qu'il n'existe aucune variable appelée « append ». Le nom « append » n'existe que dans les listes ; il n'existe pas comme nom autonome, contrairement aux fonctions intégrées telles que max ou len.
help(planets.append)
La partie "résultats attendu" indique que list.append ne renvoie rien. Cependant, si nous vérifions la valeur de planets, nous constatons que l'appel de méthode a modifié cette valeur :
planets
list.pop supprime et renvoie le dernier élément d'une liste :
planets.pop()
planets
8. Recherche dans les listes¶
Recherche dans les listes¶
Où se situe la Terre dans l'ordre des planètes ? Nous pouvons obtenir son index grâce à la méthode list.index.
planets.index('Earth')
Attention piège :¶
Il se situe en troisième position (c'est-à-dire à l'index 2 - 0 !).
À quel index Pluton se trouve-t-il ?
planets.index('Pluto')
Ah oui, c'est vrai…
Pour éviter ce genre de mauvaises surprises, nous pouvons utiliser l'opérateur in pour déterminer si une liste contient une valeur particulière :
# La Terre est-elle une planète ?
"Earth" in planets
# Tartempion est-elle une planète ?
"Tartempion" in planets
Il existe d'autres méthodes de liste intéressantes que nous n'avons pas abordées. Pour en savoir plus sur toutes les méthodes et attributs associés à un objet particulier, nous pouvons appeler help() sur l'objet lui-même. Par exemple, help(planets) nous renseignera sur toutes les méthodes de liste :
help(planets)
Cliquez sur le bouton « Sortie » pour accéder à l'aide complète. Les listes contiennent de nombreuses méthodes aux noms étranges comme eq et iadd. Ne vous en préoccupez pas trop pour l'instant. (Vous n'appellerez probablement jamais ces méthodes directement. Mais elles sont appelées en arrière-plan lorsque nous utilisons des syntaxes comme les opérateurs d'indexation ou de comparaison.) Les méthodes les plus intéressantes se trouvent en bas de la liste (append, clear, copy, etc.).
9. Tuples¶¶
Les tuples sont presque identiques aux listes. Ils diffèrent seulement sur deux points.
1 : Leur syntaxe de création utilise des parenthèses plutôt que des crochets.
t = (1, 2, 3)
t = 1, 2, 3 # équivalent à ci-dessus
t
2 : Ils ne peuvent pas être modifiés (ils sont immuables).
t[0] = 100
Les tuples sont souvent utilisés pour les fonctions ayant plusieurs valeurs de retour.
Par exemple, la méthode as_integer_ratio() des objets float renvoie un numérateur et un dénominateur sous la forme d'un tuple :
x = 0.125
x.as_integer_ratio()
Ces valeurs de retour multiples peuvent être attribuées individuellement comme suit :
numerator, denominator = x.as_integer_ratio()
print(numerator / denominator)
Enfin, nous avons un aperçu de l'astuce classique et stupide de Python pour échanger deux variables !
a = 1
b = 0
a, b = b, a
print(a, b)
10. Jouer avec des Tuples¶
Dans le Jupyter Notebook ou le JupyterLab, la bibliothèque Pandas est déjà installée mais peut-être pas la bibliothèque folium ni celle qui va permettre le géocodage sur les données OSM, geopy. Il faut les installer.
Il faut ensuite les charger (fonction import).
# Pour installer folium et geopy, effacez le # (avant le "!").
#!pip install folium
#!pip install geopy
import geopy
from geopy.distance import geodesic
import pandas as pd
import folium
10.1. Calcul de distances¶
Nous pourrions programmer un calcul de distance, mais cette fonctionalité existe déjà dans de nombreuses bibliothèques.
Dans la bibliothèqye GeoPy, nous utiliserons la fonction "geodesic" pour calculer la distance entre deux points à la surface de la Terre.
La consultation de l'aide en ligne de la bibliothèque Geopy (https://pypi.org/project/geopy/), nous apprend qu'elle permet deux calculs : l'un fournit la distance géodésique, encore appelée distance géographique (https://en.wikipedia.org/wiki/Geographical_distance), le deuxième, la distance sphérique ou orthodromique, celle des grands cercles (https://en.wikipedia.org/wiki/Great-circle_distance).
La distance géodésique est la plus petite distance à la surface d'un ellipsoïde terrestre. C'est celle de l'algorithme par défaut.
# Calcul de la distance entre deux points
# Le couple (lat, long) est un "tuple", une collection ordonnée de plusieurs éléments (on ne permutent pas les x, y et z !)
point1 = (49.916081731637746, -6.317862543498883)
point2 = (49.95567132388271, -6.339694772850285)
distance = geodesic(point1, point2)
La distance est calculée, mais rien ne s'affiche. Il faut demander l'impression du résultat !
# Affichage de la distance en mètres.
print(distance.meters, ' meters')
Il y a peut-être trop de décimales ?
# Affichage en kilomètres avec un choix de décimales égal à 2 plus un texte de d'accompagnement
print(f"Résultats : La distance géodésique entre le point 1 et le point 2 est de {distance.kilometers:.2f}", 'kilomètres')
D'autres unités sont possibles :
# En miles impériaux (ceux des anglais)
print(f"Résultats : La distance géodésique entre le point 1 et le point 2 est de {distance.miles:.2f}", 'en imperial miles')
# En milles marins (mille nautique ou nautique)
print(f"Résultats : La distance géodésique entre le point 1 et le point 2 est de {distance.nautical:.2f}", 'nautiques')
Mais où sommes nous ?
Une carte serait peut-être utiles pour faire notre choix d'unité ?
10.2. Cartographie¶
Nous allons utiliser la bibliothèque folium pour représenter notre espace cartographique.
# Indiquer les coordonnées lat, long en DD du point 1 et du point 2.
lat1 = 49.916081731637746
long1 = -6.317862543498883
lat2 = 49.95567132388271
long2 = -6.339694772850285
Map = folium.Map(location = [lat1, long1], zoom_start = 12)
Map
# Indiquer les coordonnées lat, long en DD des points 1 et 2 avec un marqueur.
folium.Marker([lat1, long1], popup = "Point mystère n°1").add_to(Map)
folium.Marker([lat2, long2], popup = "Point mystère n°2").add_to(Map)
Map
# Ajouter une ligne entre les deux points
folium.PolyLine(locations=[[lat1, long1], [lat2, long2]],
color="red",
weight=2.5, # paramètre de largeur de la ligne
opacity=0.8).add_to(Map) # opacity = pour gérer la transparence, mais pas très fficace sur polyline...
Map
# Ajouter une ligne entre les deux points
folium.PolyLine(locations=[[lat1, long1], [lat2, long2]],
color="red",
weight=2.5, # weight = paramètre de largeur de la ligne
opacity=0.8, # opacity = gére la transparence, mais pas très efficace sur polyline...
popup=f"Distance: {distance.nautical:.2f} nautiques" # ajoute en pop-up la distance calculée précédemment
).add_to(Map)
Map
Vu la localisation, quelle unité de mesure vous parait appropriée ?
D'autres calculs de distances existent comme la distance sur le grand cercle - la distance orthodromique des navigateurs (https://fr.wikipedia.org/wiki/Orthodromie mais aussi https://www.bateaux.com/article/30282/navigation-difference-loxodromie-orthodromie), la distance euclidienne - celle de nos calculs de petites distances sur les cartes topographiques (https://fr.wikipedia.org/wiki/Distance_euclidienne).