Bonjour,
maintenant que je suis en vacances, j'ai repris le problème depuis le début et je te propose les constructions suivantes :
- construction d'une liste extraite du fichier liste_des_gares en ne prenant que :
le code UIC (0), le libellé (1), le code ligne(4), le point kilométrique (6) et on ne prend que les lignes de fret (if ligne[2]=='O'). Dans ce fichier les gares apparaissent autant de fois que les lignes auxquelles elles appartiennent
- construction d'un dictionnaire dico_lignes qui a pour entrées toutes les gares de ce fichier et pour valeurs un dictionnaire des lignes auxquelles cette gare appartient, ainsi que, pour chaque ligne, la liste des gares lui appartenant et la distance algébrique avec la gare considérée au départ
- construction d'un dictionnaire adjacence() qui a pour entrées toutes les gares du fichier liste_des_gares et pour valeurs une liste de tuples des sommets adjacents par ligne obtenu par maximum des distances négatives et minimum des distances positives (la gare juste en amont et celle juste en aval).
Ceci donne le "petit code " suivant que je te laisserai décrypter :
Code : Tout sélectionner
import csv
def conversion(chaine):
""" convertit un point kilométrique de la forme 'km+m' ou 'km-m' en nombre flottant km.m"""
if "+" in chaine :
return float(chaine.split("+")[0]+"."+chaine.split("+")[1])
elif "-" in chaine:
return float(chaine.split("-")[0]+"."+chaine.split("-")[1])
### extraction des colonnes du fichier liste des gares : on a besoin du code UIC (0),du libellé (1), du code ligne(4), du point kilométrique (6) et on ne prend que les lignes de fret (if ligne[2]=='O'). Dans ce fichier les gares apparaissent autant de fois que les lignes auxquelles elles appartiennent
with open('liste-des-gares.csv',newline='',encoding='utf-8') as h :
extraction = csv.reader(h)
liste_brute = [ligne for ligne in extraction]
liste_brute = liste_brute[1:]
liste_gares = [[int(ligne[0]),ligne[1],int(ligne[4]),conversion(ligne[6])] for ligne in liste_brute if ligne[2]=='O']
### Construction du dictionnaire des gares
def dico_lignes_alg() :
"""créé un dictionnaire contenant les gares et les lignes auxquelles elles appartiennent, avec les gares de ces lignes et les distances algébriques avec la gare considérée"""
dico={}
for gare in liste_gares :
dico_noeud = {}
for element in liste_gares :
if element[0] != gare[0] and element[2] == gare[2]:
if element[2] not in dico_noeud.keys() :
dico_noeud[element[2]]=[(element[1],gare[3]-element[3])]
else :
dico_noeud[element[2]].append((element[1],gare[3]-element[3]))
if gare[1] in dico.keys():
dico[gare[1]].update(dico_noeud)
else :
dico[gare[1]] = dico_noeud
return dico
### Construction du dictionnaire d'adjacence
def matrice_adjacence() :
"""créé un dictionnaire contenant les gares et leurs distances aux noeuds les plus proches sur les lignes auxquelles elles appartiennent"""
dico = dico_lignes_alg()
adjacence = {}
for gare in dico.keys() :
for ligne in dico[gare].keys():
liste_amont = [element for element in dico[gare][ligne] if element[1]<0]
if liste_amont != []:
liste_amont_triee = sorted(liste_amont, key=lambda t: t[1])
maximum = max(liste_amont_triee,key=lambda t: t[1])
if gare not in adjacence.keys() :
adjacence[gare] = [(maximum[0],abs(maximum[1]),ligne)]
else :
adjacence[gare].append((maximum[0],abs(maximum[1]),ligne))
liste_aval = [element for element in dico[gare][ligne] if element[1]>0]
if liste_aval != []:
liste_aval_triee = sorted(liste_aval, key=lambda t: t[1])
minimum = min(liste_aval_triee,key=lambda t: t[1])
if gare not in adjacence.keys() :
adjacence[gare]=[(minimum[0],abs(minimum[1]),ligne)]
else :
adjacence[gare].append((minimum[0],abs(minimum[1]),ligne))
return adjacence
Un petit appel pour la gare de Châteauroux donne :
Code : Tout sélectionner
>>> matrice_adjacence()['Châteauroux']
[('St-Maur-sur-Indre', 5.951999999999998, 594000), ('Argenton-sur-Creuse', 30.990999999999985, 590000), ('Montierchaume', 8.50200000000001, 590000)]
Lorsqu'on a pas l'autre bout d'une ligne, c'est que la gare appelée est un terminus de la ligne, ce qui est le cas de la 594000 qui va de Joué les tours à Châteauroux
Je te laisse le soin de décrypter ce travail qui doit se rapprocher de ce que ton professeur attend. Pour l'instant c'est un dictionnaire car cela me semble le plus logique : pour chaque gare, on lui attribue la liste des gares adjacentes avec leur distance (j'ai rajouté les numéros de ligne pour vérification mais on peut s'en passer.
Bon travail