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 :

Utilisation de set


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Utilisation de set
    Salut

    J'essaye d'utiliser un Set dans une boucle for d'une méthode et lors de l'appel à la méthode add la boucle s'arrête après une itération.

    Code :
    ------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    mySet = Set[]
     
    def maMethode(chaine):
       mList = chaine.split(' ')
       for m in mList:
           mySet.add(m)
     
    maMethode('un deux deux trois')
    print mySet
    -----

    Le print donne "un"et on sort on ne peut rien executer après add dans la boucle for.


    Pouvez-vous m'éclairer ?

    Merci

  2. #2
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonsoir,
    chez moi j'obtiens Set(['un', 'trois', 'deux']). Je suis sous Python 2.6.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    c'est quoi ?
    s'pas mieux ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    setmoissa = lambda phrase: set(phrase.split())
     
    monset = setmoissa("un deux deux trois")
    print monset

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par rambc Voir le message
    Bonsoir,
    chez moi j'obtiens Set(['un', 'trois', 'deux']). Je suis sous Python 2.6.
    Sans modifier la première ligne ?
    Mais bon, moi aussi j'ai ce résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
    [GCC 4.4.5] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> mySet = set()
    >>> def maMethode(chaine):
    ...    mList = chaine.split(' ')
    ...    for m in mList:
    ...        mySet.add(m)
    ... 
    >>> maMethode('un deux deux trois')
    >>> print mySet
    set(['un', 'trois', 'deux'])
    Y compris comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mySet = set()
     
    def maMethode(chaine):
        for m in chaine.split():
            mySet.add(m)
     
    maMethode('un deux deux trois')
    print mySet
    Je trouve que c'est plus lisible que lambda

    @+

  5. #5
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Je ne vois pas trop comment le code initial, même légèrement corrigé, a pu afficher "un".
    Je ne trouve pas le lamda particulièrement illisible, mais en revanche plutôt à éviter quand il est gratuit. Moins maintenable, et il peut casser des outils (vue outline, refactoring, etc.). Sans lamdda, c'est tout aussi simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def buildSet(chaine):
        return set(chaine.split(' '))
     
    mySet = buildSet('un deux deux trois')
    print mySet
    mySet = mySet.union(buildSet('one two three two'))
    print mySet
    mySet = buildSet('one two three two')
    print mySet
    Notez que le comportement n'est pas le même que celui de la fonction du message initial. L'utilisation immodérée des foo, bar et autres maMethode peut masquer des erreurs de conception. Ce n'est pas plus cher d'utiliser des noms significatifs dès le brouillon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def mySetAddElems(chaine):
        for m in chaine.split():
            mySet.add(m)
     
    mySet = set()
    mySetAddElems('un deux deux trois')
    print mySet
    mySetAddElems('one two three two')
    print mySet
    Là, on peut rendre la fonction un peu plus réutilisable et un peu moins piégée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def addElems(chaine, set):
        for m in chaine.split():
            set.add(m)
     
    mySet = set()
    print mySet
    addElems('un deux deux trois', mySet)
    print mySet
    addElems('one two three two', mySet)
    print mySet

  6. #6
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonjour.

    Citation Envoyé par PauseKawa Voir le message
    Sans modifier la première ligne ?
    Si je te rassure.

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> mySet = Set[]
      File "<stdin>", line 1
        mySet = Set[]
                    ^
    SyntaxError: invalid syntax
    >>>

  8. #8
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Je voulais dire : "Si je te rassure, j'ai bien modifié la ligne...".

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Une autre version, pour la route:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def addElems(chaine):
        mySet.update(chaine.split(' '))
    Mais ma préférence va tout de même à la première fonction de Pierre Maurette:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def buildSet(chaine):
        return set(chaine.split(' '))
    Compréhensible en isolation (pas besoin de savoir ce qu'est mySet), fonctionnelle (la valeur de retour ne dépend que de celles des arguments), et sans effets de bord (ne modifie rien en dehors de la fonction).

  10. #10
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Une question: Puisque c'est l'espace le caractère de séparation pour split pourquoi le mettre au lieu d'un .split() ?

    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
    >>> def buildSet(chaine):
    ...     return set(chaine.split())
    ... 
    >>> mySet = buildSet('un deux deux trois')
    >>> print mySet
    set(['un', 'trois', 'deux'])
    >>> mySet = mySet.union(buildSet('one two three two'))
    >>> print mySet
    set(['un', 'trois', 'deux', 'one', 'three', 'two'])
    >>> mySet = buildSet('one two three two')
    >>> print mySet
    set(['three', 'two', 'one'])
    >>> def buildSet(chaine):
    ...     return set(chaine.split(' '))
    ... 
    >>> mySet = buildSet('un deux deux trois')
    >>> print mySet
    set(['un', 'trois', 'deux'])
    >>> mySet = mySet.union(buildSet('one two three two'))
    >>> print mySet
    set(['un', 'trois', 'deux', 'one', 'three', 'two'])
    >>> mySet = buildSet('one two three two')
    >>> print mySet
    set(['three', 'two', 'one'])
    >>>

  11. #11
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Une question: Puisque c'est l'espace le caractère de séparation pour split pourquoi le mettre au lieu d'un .split() ?
    Les caractères de séparation par défaut ne sont pas limités à des espaces, mais comprennent tous les caractères "blancs" (tabulation, retour de ligne, ...). Les deux formulations ne sont donc pas équivalentes.

  12. #12
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Me suis planté, le split() devait être vide. Bien sûr.

  13. #13
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par dividee Voir le message
    Les caractères de séparation par défaut ne sont pas limités à des espaces, mais comprennent tous les caractères "blancs" (tabulation, retour de ligne, ...). Les deux formulations ne sont donc pas équivalentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> txt = '     a       b c    d'
    >>> print txt.split()
    ['a', 'b', 'c', 'd']
    >>> print txt.split(' ')
    ['\ta\tb', 'c', '', '', '', 'd']
    Autant pour moi. Promis, la prochaine fois je teste.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2007, 13h59
  2. Utilisation des set
    Par Ikit dans le forum C++
    Réponses: 16
    Dernier message: 22/11/2006, 16h12
  3. Utilisation des sets
    Par Original Prankster dans le forum SL & STL
    Réponses: 6
    Dernier message: 08/02/2006, 21h28
  4. utiliser les set en C++
    Par yaskiki dans le forum C++
    Réponses: 2
    Dernier message: 05/10/2005, 16h04
  5. utilisation de set locale
    Par ColonelHati dans le forum C
    Réponses: 7
    Dernier message: 02/05/2005, 14h25

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