IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Boucles FOR/FOR/IF imbriquées : comment revenir au premier FOR ? [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut Boucles FOR/FOR/IF imbriquées : comment revenir au premier FOR ?
    Bonjour,

    J'ai un programme qui cherche la correspondance entre une liste de mots et un fichier Test. De façon simplifiée, ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for mot in mots:
        for ligne in fichier_test:
            resultat= re.search(mot,ligne)
            if resultat:
               print resultat
    Quand le mot est trouvé dans le fichier, je l'affiche (s'il est absent, pas d'affichage) et j'arrête de parcourir le fichier.
    Mon problème c'est comment passer au mot suivant sans parcourir le reste du fichier : bref revenir à "for mot in mots"
    J'ai essayé break mais ça parcourt tous les mots suivants mais sans chercher s'ils sont bien dans le fichier.

    Bref, je commence à ne plus m'y retrouver

    Merci pour vos conseils !!

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je suppose que fichier_test est juste un fichier ouvert, dresse plutôt la liste des lignes avec readlines() comme ça la boucle reprendra au début de la liste et tu mets ton break juste après le print.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    break permet de sortir d'une boucle, mais pas des 2 boucles imbriquées d'un seul coup.

    C'est un problème assez courant, et je choisis selon le contexte l'une des 2 solutions suivantes (ce ne sont que des codes de principe!):

    - mettre un 2ème break déclenché par un drapeau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    findeboucle = False
    for mot in mots:
        for ligne in fichier_test:
            resultat= re.search(mot,ligne)
            if resultat:
                print(mot)
                findeboucle = True
                break
        if findeboucle:
            break
    - Créer une petite fonction, et sortir au bon endroit par return (qui sort de la fonction, donc sort des 2 boucles d'un seul coup):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def trouvemot(mots, fichier_test):
        for mot in mots:
            for ligne in fichier_test:
                resultat= re.search(mot,ligne)
                if resultat:
                    return mot

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut
    Bonjour et merci pour vos réponses !

    @VinsS : je ne sais pas si je peux utiliser readlines (ça veut dire que tout le fichier est lu ?) car c'est un groooooos fichier

    @tyrtamos : comme le code est déjà dans une fonction, j'ai voulu faire au plus simple donc j'ai tenté la première version avec une liste de mots contenant 2 fois le même mot. Je sais que ce mot est bien présent dans le fichier Test (qui est un fichier ouvert), mais je n'obtiens de résultat que pour le premier mot.

    J'ai rajouté deux print pour voir ce qui se passait :
    - le 1er mot est bien traité par la boucle "for mot in mots" et j'ai l'affichage "fin de boucle". Je n'ai pas d'autre affichage
    - le 2e mot n'est pas traité par la boucle "for mot in mots" car je n'ai pas d'affichage "mot recherché....".

    En déplaçant l'initialisation 'findeboucle=False' juste après 'for mot in mots', ou bien si j'enlève le premier BREAK, ça ne change rien.

    Si j'enlève les 2 BREAK, j'ai l'affichage "mot recherché: 2e mot" et "fin de boucle" (ce qui veut dire qu'il y a bien un résultat de regex) mais je n'obtiens pas le résultat de la regex (normalement les résultats sont stockés dans un autre fichier) .

    Merci pour vos conseils avisés !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    findeboucle = False
    for mot in mots:
        print "mot recherché : " + mot
        for ligne in fichier_test:
            resultat= re.search(mot,ligne)
            if resultat:
                print(mot)
                findeboucle = True
                break
        if findeboucle:
            print "fin de boucle"
            break

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Le dernier code que tu montres interrompt aussi la boucle for mot in mots: dès que le premier mot est trouvé dans le texte. Ce qui n'est pas ce que tu désires.

    Essaye plutôt comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for mot in mots:
        with open('mon_fichier', 'r') as fichier_test:
            for ligne in fichier_test:
                resultat= re.search(mot,ligne)
                if resultat:
                    print(mot)
                    break

  6. #6
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 43
    Par défaut
    merci VinsS,

    Voilà, le problème est résolu : en fait j'ouvrais le fichier en lecture avant les boucles et pour une raison que j'ignore seul le premier mot était "traité" par la regex alors qu'en l'ouvrant comme tu le fais, c'est OK !!
    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Boucles For et IF imbriquées
    Par tshokwe dans le forum R
    Réponses: 2
    Dernier message: 28/04/2011, 09h38
  2. Vectorisation boucle for (simple et imbriquée)
    Par derzy971 dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/11/2009, 16h42
  3. Comment installer oracle 9i for Linux
    Par sultanlok dans le forum Installation
    Réponses: 2
    Dernier message: 09/09/2008, 12h01
  4. [XSL]Comment faire ceci ?? Mon for-each n'affiche pas tout !
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 27/07/2005, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo