Bonjour
Je fais un petit script qui doit prendre le résultat d'une requête sql, rajouter quelques trucs et écrire le tout dans un fichier. Mon problème se situe au niveau du "rajouter quelques trucs".
Tout d'abord, mes données : des carres(aire géographique) dans lesquels il y a des points(point gps), des dates(je ne garde que l'année), un nombre d'individus par date par année. Pour chaque point, il y a 2 relevés par ans(= 2 dates), et pour chaque relevé un nombre d'individus. Je ne garde sur les 2 relevés de l'année que celui avec le nombre max d'individus. Tout ça est stocké dans une liste de listes triée par point puis par date.
['001002', 2007, 1] <-- ['Point (string)', année (int), nb d'ind (int)]
Jusque là tout va bien, je vous explique ça pour vous mettre dans le bain.
Parfois, pour un point et une année, il n'y a pas d'informations, soit que le relevé n'a pas été effectué(alors nb d'individus = -1), soit qu'on n'a rien vu (alors nb d'individus = 0).
Je dois donc remplir les trous, en rajoutant le N° du point, l'année et le nombre d'individus. Pour savoir si le relevé a été effectué j'ai une autre liste par ex : [ [ '0010', 2001 ], [ '0010', 2002 ], [ '0010', 2005 ], [ '0032', 2006 ]....].
Les 4 premiers chiffres du point correspondent au carré : '001001' --> carré N°0010 point N°01. C'est pour ça que j'ai gardé le point en type string.
Je pense qu'il y a une boucle infinie quelque part, je vous soumets mon code, pendant que je continue à débugguer pour trouver l'erreur car j'y suis depuis vendredi et je me dis que peut être un coup d'oeil neuf de quelqu'un pourrait peut être déceler une énormité dans mon script.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 def compltrim(observes, suivis): liste = [] liste.append(observes[0]) dico={} fin = 0 for i in range(1, len(observes)) : if (liste[fin][0] != observes[i][0]): # si chgt de site if (observes[i][1] == 2001): # si l'annee est bien 2001 liste.append(observes[i]) else : # si l'annee n est pas 2001 dico = releff(suiv, observes[i][0][:4]) if dico.has_key(2001): # si le carre a ete suivi mais pas de contact liste.append([observes[i][0], 2001, 0]) else: # si le carre n'a pas ete suivi liste.append([observes[i][0], 2001, -1]) else :# (liste[fin][0] == observes[i][0]): # si pas chgt de site if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees liste.append(observes[i]) else : # trou ds les annees dico = releff(suiv, observes[i][0][:4]) while(liste[fin][1] != (observes[i][1]-1)): # tant qu'il y a un trou if ( dico.has_key(liste[fin][1]+1)): # si le carre a ete suivi mais pas de contact liste.append([observes[i][0], liste[fin][1]+1, 0]) else : # si le carre n a pas ete suivi liste.append([observes[i][0], liste[fin][1]+1, -1]) fin = len(liste) - 1 if ( liste[fin][1]+1 == observes[i][1]): # si bon enchainement d'annees apres la boucle liste.append(observes[i]) fin = len(liste) - 1 return liste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 # cette fonction renvoie un dico contenant des couples clé(année)-valeur(carre), permet de trouver rapidement si le carre a été suivi une certaine année. def releff(suiv, carre): coord = trouvcoord(suiv, carre) dico = {} for j in range(coord[0], coord[1]): dico[suiv[j][1]] = suiv[j][0] return dicoJ'ai fait quelques choix comme ne pas faire d'insertion mais remplir une liste, ça buggait pas mal et j'ai voulu "officialiser" tous les contrôles, même si je pense qu'il vaut mieux procéder par insertion par soucis de mémoire utilisée, ou ne pas faire de contrôle sur le premier relevé (ligne 3) car je réserve ça à quand j'aurais résolu mon problème actuel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 # cette fonction renvoie une liste contenant le premier et le dernier indice pour lesquels le carré est égal au carré donné en argument def trouvcoord(lissuiv, ref): stop = len(lissuiv) i = 0 while ( (i != stop) and (lissuiv[i][0] != ref) ): i += 1 deb = i fin = deb while ( (fin != stop) and(lissuiv[fin][0] == ref) ): fin += 1 fin = fin -1 return [deb, fin]
Si vous voyez des trucs ça m'aiderait bien ou si vous ne comprenez rien à ce que j'ai fait je vous expliquerai mieux et peut être que comme ça je trouverai.
Merci d'avoir lu mon post et bonne journée
Partager