Se connecter

Informatique

Programmation

Sujet : [Python] Probleme execution sur le dernier element d'une loop
1
Pseudo supprimé
Niveau 7
22 janvier 2020 à 16:18:53

Salut j'ai un soucis,

Lorsque j'execute une fonction issue d'une bibliothèque (dans l'exemple la fonction delete) sur les elements d'une boucle, cela ne fonctionne pas sur le dernier element de la boucle

Exemple :

for element in monfichier :
...if element.longueur > 10
...element.delete

Admettons j'ai 10 élément dans monfichier et bien ela n'agit pas sur le dernier element de la boucle c'est l'element 10, pourtant je ne suis pas sorti de la boucle (testé)

J'avais réussi a pallier ca en appelant une fonction :

def fonction_supprime(taille)
...if taille > 10
...element.delete

For element in monfichier :
...fonction_supprime(element.longueur)

Mais cette fois ca ne fonctionne pas

J'ai essaye de varier l'ordre des elements mais rien a faire.

Si quelqu'un connait ce problème, merci

labonneidee
Niveau 30
22 janvier 2020 à 17:42:49

tu traces des multipolygonnes avec coordonnées géographique ?

Jean-OCaml
Niveau 17
22 janvier 2020 à 17:52:00

Je n'ai jamais fait de python, mais ça me paraît hautement suspect de supprimer un élément tout en itérant sur la liste.

Il faut tenter d'itérer sur une copie ou alors d'avoir un code plus "fonctionnel" avec les compréhensions.

https://stackoverflow.com/questions/1207406/how-to-remove-items-from-a-list-while-iterating

cybevil
Niveau 17
22 janvier 2020 à 18:01:12

J'ai un peu de mal à cerner ce que tu veux faire, en gros tu essaies de supprimer les éléments qui viendrais s'ajouter au 10ème élément de ta liste, c'est ça ?

SiBeteNDaye
Niveau 6
22 janvier 2020 à 19:25:09

Je ne sais pas ce fait element.delete (enfin je suppose que c'est un appel, element.delete()) mais modifier un iterable sur lequel tu es justement en train d'iterer est la meilleure façon d'avoir des effets de bord indésirables dans tous les sens. Je suis même étonné que ton code s'exécute sans exception.

Il serait plus simple et plus propre filtrer le contenu de monfichier pour en créee une copie qui ne contiendrait que ce que tu veux.

Pseudo supprimé
Niveau 7
22 janvier 2020 à 20:27:38

En fait mon delete fait appel à une fonction particuliere d'une bibliothèque. (La bibliothèque en question s'appelle ogr)

Les données de monfichier sont comme une table contenant divers attribut dont des coordonnées, des dimensions, un nom etc. Chaque element represente un polygone de batiment diposant donc de plusieurs points geographique.

Cette fonction delete agit sur une donnée virtuelle, tant que je ne l'ai pas "update" il ne se passe rien. Donc il n'y pas de soucis dans la boucle, je peux meme supprimer avant de mettre a jour une valeur d'un attribut.

Bref j'ai resolu mon soucis, en faisant un nouveau "update" après le dernier delete.
Pour cela j'ai ete oblige de relancer ma boucle jusuq'au premier element, de lui changer une valeur d'attribut par la meme valeur, et de update la table.
Ne la relançant que jusqu'à premier element (avec un while) je ne m'oblige à reboucler sur toutes les entites (il y en a + 300.000)
Car petite particularite la fonction d'update ne fonctionne pas avec la fonction delete, et elle ne "s'active" que si il y a eu changement effectif donc oblige de changer un element de la table.

Cela me posais soucis que si la derniere action sur la table est un delete.

Voila voila

Merci pour vos réponses quand meme :)

Pseudo supprimé
Niveau 7
22 janvier 2020 à 20:36:05

Pour information, je recuperais la geometrie de chacun des batiments, si celui ci etait trop grand ou trop petit je le supprimais. Et parralement si ca ne remplissait pas les conditions j'ajoutais un attribut avec la geomatrie du batiment en question (son aire). Cela fonctionnait sauf si le dernier element devait etre delete. Car apres chaque ajout d'attribut aire je mettais un update feature. Sauf que le update feature ne fonctionne pour mettre a jour la table si je supprime le dernier element, logique puisque le dernier element je le supprime. Et je ne peux pas mettre a jour la table mais seulement les elements.

1
Sujet : [Python] Probleme execution sur le dernier element d'une loop
   Retour haut de page
Consulter la version web de cette page