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 plusieur fois un élément dans une liste


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Supprimer plusieur fois un élément dans une liste
    Bonjours/Bonsoir je suis étudiant en prépa TSI et dans le cadre de nos cours d'informatique j'ai un exercice a faire mais je suis bloqué

    Dans mon programme je souhaite travailler sur une liste de prénom et afficher le nombre de fois qu'un prénom se répète. Par exemple si ma liste est ["bob","sam","bob","noe"] le programme doit me retourner :

    bob:2
    sam:1
    noe:1

    Voici mon programme:

    liste=["bob","joe","noe","bob","bob","noe"]

    def compteur(prenom):
    nb_prenom=0

    for i in liste:
    nb_prenom=nb_prenom+i.count(prenom)

    print (prenom,":",nb_prenom)

    for prenom in liste:
    print(compteur(prenom))


    Le problème est qu'il me retourne:

    bob:3
    joe:1
    noe:2
    bob:3
    bob:3
    noe:2

    Je cherche donc un moyen de supprimer un prénom de la liste une fois qu'il a été compté pour ne pas avoir de répétition lors de l'affichage final. J'ai essayer d'utiliser la fonction "remove" sur la liste mais je n'y suis pas parvenus. Merci d'avance pour votre aide

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    Classiquement, ce genre de choses se traite plutôt en utilisant un dictionnaire dont les clés sont, ici, les prénoms et les valeurs, le nombre d'occurrences du dit-prénom.

    Tu le construis dans une boucle sur les prénoms de ta liste et tu affiches, au final, le contenu de ton dictionnaire : chaque clé/prénom n'apparaitra qu'une seule fois.

    De plus, utilise les balises code (bouton '#') pour insérer du code : on aura la coloration syntaxique mais surtout l'indentation, indispensable en Python.

    Et, pour ton code, deux remarques :

    • c'est tordu de comparer le prénom courant avec le prénom passé en paramètres à la fonction via un "i.count(prenom)" (méthode count de str)
    • le véritable affichage de ton script intercale des "None", vu que tu affiches le retour de la fonction compteur qui ... ne retourne rien


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    plxpy@host:~/Bureau$ python3 prenoms.py 
    bob : 3
    None
    joe : 1
    None
    noe : 2
    None
    bob : 3
    None
    bob : 3
    None
    noe : 2
    None
    EDIT : avec le "str.count" tordu, si la liste de prénoms vaut ['fred', 'frederic'], 'fred' est considéré comme apparaissant 2 fois ...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Dr_Blurp Voir le message
    Bonjours/Bonsoir je suis étudiant en prépa TSI et dans le cadre de nos cours d'informatique j'ai un exercice a faire mais je suis bloqué

    Dans mon programme je souhaite travailler sur une liste de prénom et afficher le nombre de fois qu'un prénom se répète. Par exemple si ma liste est ["bob","sam","bob","noe"] le programme doit me retourner :

    bob:2
    sam:1
    noe:1

    Voici mon programme:

    liste=["bob","joe","noe","bob","bob","noe"]

    def compteur(prenom):
    nb_prenom=0

    for i in liste:
    nb_prenom=nb_prenom+i.count(prenom)

    print (prenom,":",nb_prenom)

    for prenom in liste:
    print(compteur(prenom))


    Le problème est qu'il me retourne:

    bob:3
    joe:1
    noe:2
    bob:3
    bob:3
    noe:2

    Je cherche donc un moyen de supprimer un prénom de la liste une fois qu'il a été compté pour ne pas avoir de répétition lors de l'affichage final. J'ai essayer d'utiliser la fonction "remove" sur la liste mais je n'y suis pas parvenus. Merci d'avance pour votre aide
    Bonsoir,
    Les remarques de plxpy sont très justes et appropriées.
    J'ajouterais seulement que la fonction employée (compteur) devrait renvoyer un résultat:
    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
    liste=["bob","joe","noe","bob","bob","noe"]
     
    def compteur(prenom):
        nb_prenom=0
     
        for i in liste:
            nb_prenom=nb_prenom+i.count(prenom)
     
        # 1) ici le "print" affiche bien le nombre de répétitions du prénom
        # print (prenom,":",nb_prenom)
        # mais c'est une fonction qui est appelée dans un "print": on
        # s'attend donc à ce que la fonction renvoie son résultat
        # pour cela le mot clef est "return": cela supprime aussi les "None"
        return nb_prenom
     
    for prenom in liste:
        # 2) la fonction "compteur" renvoie les prénoms, c'est ici que doit se faire
        # la mise en forme
        # print(compteur(prenom))
        print (prenom,":",compteur(prenom))
    C'est ce qui éviterait l'apparition des "None" disgracieux et intempestifs.
    Ainsi que le souligne plxpy, l'utilisation d'un dictionnaire semble plus qu'appropriée.
    Si par hasard cet outils n'a pas (encore) été étudié, une autre solution, mais nettement plus lourde, serait par exemple de constituer une liste contenant les prénoms uniques et de n'utiliser que les prénoms de cette dernière comme argument de la fonction "compteur".
    Clodion

    PS: Quand à la méthode "remove":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> liste=["bob","joe","noe","bob","bob","noe"]
    >>> liste
    ['bob', 'joe', 'noe', 'bob', 'bob', 'noe']
    >>> liste.remove("bob")
    >>> liste
    ['joe', 'noe', 'bob', 'bob', 'noe']
    >>>
    Cette méthode est assez explicite. Dans le cas contraire la console est le meilleur ami:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> help(liste.remove)
    Help on built-in function remove:
     
    remove(...)
        L.remove(value) -> None -- remove first occurrence of value.
        Raises ValueError if the value is not present.
     
    >>>
    Avec comme seul inconvénient dans ce contexte, la suppression d'une seule occurrence. Mais cela est très facilement utilisable par emploi d'un compteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> liste
    ['bob', 'joe', 'noe', 'bob', 'bob', 'noe']
    >>> for cpt in range(3):
    	liste.remove("bob")
     
     
    >>> liste
    ['joe', 'noe', 'noe']
    >>>
    Or ce compteur, justement, vous venez de le récupérer en comptabilisant le nombre d'apparition d'un prénom dans la liste…

  4. #4
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    C'est en fait une fonction d'occurrence que tu dois faire , et le bonus est de faire un genre de dico tabulé .
    Avec l'expression print(compteur(prenom)) et la boucle for , en fait , il n'y a pas de tri , toute la liste de départ est analysée (ou scannée) , ce qui explique les doublons ( le nombre d'occurrences est répété inutilement ) .Tu pourrais utiliser modulo %t , et %n avec un dico pour obtenir l'affichage souhaité .Regardes les opérateurs de substitution de chaines de caractères ...

    PS : Tu peux ne pas utiliser la fonction count() et ne pas initialiser la variable nb_prenom=0 (enfin je pense ) .

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 390
    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 390
    Points : 36 941
    Points
    36 941
    Par défaut
    Salut,

    Citation Envoyé par Dr_Blurp Voir le message
    Dans mon programme je souhaite travailler sur une liste de prénom et afficher le nombre de fois qu'un prénom se répète. Par exemple si ma liste est ["bob","sam","bob","noe"] le programme doit me retourner
    Le soucis est que "liste de prénoms qui se répètent" est différent de la "liste des prénoms" dont on voudrait compter les occurrences dans...
    Regardez par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> PRENOMS = "bob", "joe", "noe"
    >>> liste = ["bob","joe","noe","bob","bob","noe"]
    >>> for prenom in PRENOMS:
    ...     print (prenom, liste.count(prenom))
    ...
    bob 3
    joe 1
    noe 2
    En sachant "quoi" compter, çà devient plus facile... Et on n'a même plus le soucis de savoir si çà a déjà été compté ou pas.

    Après vous pourriez dire "mais je ne connais pas la listes des prénoms!"
    On pourrait la construire avec "set":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> for prenom in set(liste):
    ...     print (prenom, liste.count(prenom))
    ...
    joe 1
    bob 3
    noe 2
    >>>
    ou au fur et à mesure via un dict:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> counter = {}
    >>> for prenom in liste:
    ...     if prenom not in counter:
    ...         counter[prenom] = 0
    ...     counter[prenom] += 1
    ...
    >>> print(counter)
    {'joe': 1, 'bob': 3, 'noe': 2}
    Comme les programmeurs doivent souvent réaliser ce genre de comptage, les bibliothèques Python proposent des solutions prêtes à l'emploi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from collections import Counter
    >>>
    >>> counter= Counter(liste)
    >>> print (counter)
    Counter({'bob': 3, 'noe': 2, 'joe': 1})
    >>>
    Mais avant de les utiliser, il faut apprendre en jouant avec les structures et constructions de base.

    - W

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 5
    Points
    5
    Par défaut Merci
    Super merci tout le monde je ne m'attendais pas à tant de réponses grâce à vous j'ai réussi a finir mon exo et je comprend tout sur les listes !

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

Discussions similaires

  1. Sélectionner plusieurs éléments dans une liste
    Par morgan47 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/11/2011, 11h16
  2. Réponses: 27
    Dernier message: 29/08/2011, 09h13
  3. Sélectionner un élément dans une liste multiple
    Par sourivore dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/03/2006, 11h47
  4. [debutant] insertion d'éléments dans une List
    Par gwenou60 dans le forum Composants
    Réponses: 1
    Dernier message: 05/12/2005, 09h59
  5. contrôler l'absence d'un élément dans une liste donnée
    Par gendalf37 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/09/2005, 10h02

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