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 :

Supprimer quelques éléments d'une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut Supprimer quelques éléments d'une liste
    Bonjour,
    Ce code ne donne pas le résultat attendu : supprimer les éléments de la liste contenant un nombre
    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
    # -*- coding: iso8859-1 -*-
    import re
     
    document=['alien','g23g','barn','9sa','b24']
     
    copie_doc = document  # copier la liste originale
    mot=""           
    print('liste originale',copie_doc)
     
    for mot in copie_doc:
        try:
            if int(re.findall('\d+', mot)[0]): # nombre dans la variable
                copie_doc.remove(mot)
        except: # la variable ne contient pas de nombre
            pass
     
    print('résultat',copie_doc)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste originale ['alien', 'g23g', 'barn', '9sa', 'b24']
    résultat ['alien', 'barn', 'b24']
    Dans la liste de sortie, l'élément 'b24' est conservé. Cela provient probablement de l'action de la ligne copie_doc.remove(mot)
    Par contre, je n'arrive pas à corriger ces lignes
    Alain

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Je pense que re.findall n'est pas adapté au problème, par contre re.search peut faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> document=['alien','g23g','barn','9sa','b24']
    >>> for mot in document:
    ...     if re.search('\d+', mot):
    ...         print(mot)
    ... 
    g23g
    9sa
    b24

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Je pense que re.findall n'est pas adapté au problème, par contre re.search peut faire l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> document=['alien','g23g','barn','9sa','b24']
    >>> for mot in document:
    ...     if re.search('\d+', mot):
    ...         print(mot)
    ... 
    g23g
    9sa
    b24
    J'ai appliqué la solution proposée, le problème persiste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import re
     
    document=['alien','g23g','barn','9sa','b24']
    print('liste originale',copie_doc)
     
    for mot in copie_doc:
        try:
            if re.search('\d+', mot): # nombre dans la variable
                copie_doc.remove(mot)
                continue
        except: # la variable ne contient pas de nombre
            pass
     
    print('résultat',copie_doc)
    J'ai un code de secours qui donne satisfaction (ci-dessous), mais ne pas trouver la correction du bug ci-dessus me gonfffle
    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
     #code ok
    import re
    document=['alien','g23g', 'barn','9sa', 'b24',  'ouf']
    fin=len(document)-1
    copie_doc = document  # copier la liste originale
    mot=""   
     
    print(copie_doc)
    a=0
     
    while a < fin:    
            mot=copie_doc[a]
            try:
                if int(re.findall('\d+', mot)[0]): # nombre dans la variable
                    copie_doc.remove(mot)
                    fin=len(document)-1
                    continue
            except: # la variable ne contient pas de nombre
                pass
            a=a+1
    print(copie_doc)

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Sans expression régulière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> document = ['alien','g23g','barn','9sa','b24']
    >>> nums = set(str(i) for i in range(10))
    >>> doc2 = [document[i] for i, n in enumerate(document) if not set(n) & set(nums)]
    >>> doc2
    ['alien', 'barn']

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J'ai appliqué la solution proposée, le problème persiste
    Non ! vous ne déclarez pas copie_doc, ça ne peut pas fonctionner, c'est sans doute une erreur de copier coller, mais si vous dites ça ne fonctionne pas, vérifiez au moins que l'erreur est en rapport avec votre problème en le testant !

    Ensuite, je préfère partir d'une liste vide et ajouter les éléments ne comportant pas d'entier, ça évite la copie supplémentaire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import re
     
    document=['alien','g23g','barn','9sa','b24']
    copie_doc = []
    print('liste originale', document)
     
    for mot in document:
        if not re.search('\d+', mot):
            copie_doc.append(mot)
     
    print(copie_doc)
    Pour votre erreur avec remove, c'est votre try except continue qui sont des keywords mal utilisés et surtout inutiles.
    Voici le code corrigé, cependant ça reste moins naturel en python et dans beaucoup d'autres langages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import re
     
    document=['alien','g23g','barn','9sa','b24']
    copie_doc = document[:] # pour une copie (problème de référence)
    print('liste originale', document)
     
    for mot in document:
        if re.search('\d+', mot):
            copie_doc.remove(mot)
     
    print(copie_doc)

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Pourquoi si compliqué?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> document=['alien','g23g','barn','9sa','b24']
    >>> document = [ s for s in document if s.isalpha() ]
    >>> document
    ['alien', 'barn']
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Merci fred1599 et bistouille,
    Vos solutions sont simples et efficaces, et vos conseils précieux.

    Dernière demande avant de clore cette discussion, comment s'écrit le code de bistouille "ligne par ligne"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nums = set(str(i) for i in range(10))
    doc2 = [document[i] for i, n in enumerate(document) if not set(n) & set(nums)]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i in range(10): # de 0 à 9
        nums = set(str(i))
        for i, n in enumerate(document):
              ...
              ...
    là je bloque

Discussions similaires

  1. supprimer un élément d'une liste avec erase
    Par jane40 dans le forum Débuter
    Réponses: 12
    Dernier message: 24/01/2009, 12h26
  2. Réponses: 7
    Dernier message: 23/04/2008, 10h21
  3. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  4. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  5. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08

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