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 :

compréhension de liste paire par paire


Sujet :

Python

  1. #1
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut compréhension de liste paire par paire
    Petite question super basique sur laquelle je m'arrache les cheveux :

    Peut-on générer une liste par compréhension en ajoutant des éléments 2 par 2 (n par n) ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> [ a for a in xrange( 5 )]
    [0, 1, 2, 3, 4]
     
    >>> [ (a,a+1) for a in xrange( 5 )]
    [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
     
    >>> [ a,a+1 for a in xrange( 5 )]
      File "<stdin>", line 1
        [ a,a+1 for a in xrange( 5 )]
                  ^
    SyntaxError: invalid syntax
    Première ligne : génération en ajoutant les éléments 1 par 1 : OK
    Deuxième ligne : génération en ajoutant les éléments 2-uplet par 2-uplet : OK
    Troisième ligne : génération en ajoutant les éléments 2 par 2 : fail !
    Mais comment obtenir [0, 1, 1, 2, 2, 3, 3, 4, 4, 5] (par compréhension de liste bien sûr) ?

    Merci d'avance !
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print [x//2 for x in xrange(1,20)]
    [0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    juste une idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    max = 5
    tata = [x for x in [x/2 for x in range(max *2 + 2)]][1:-1]
    print tata
    A+

    Pfeuh

    Grillé!

  4. #4
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Merci de vos réponses, mais hum...
    je n'ai pas réussi à me faire comprendre... désolé...

    En fait, ce n'est pas la suite 0, 1, 1, 2, 2, 3, 3, 4, 4, 5 qui m’intéresse, c'est la façon de générer des listes en ajoutant les éléments 2 par 2.

    Voici une variante du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> f1 = lambda x : # fonction mystère
    >>> f2 = lambda x : # autre fonction mystère
    >>> f3 = lambda x : (f1( x ),f2( x ))
    >>> [f3( x ) for x in xrange( 5 )]
    [(0, -11), (-2, -8), (2, -3), (18, 4), (52, 13)]
    Et bien sûr, ce que je voudrais obtenir c'est [0, -11, -2, -8, 2, -3, 18, 4, 52, 13]...

    Le cas général qui m’intéresse, c'est avec une fonction f3 qui renvoie un n-uplet quelconque.
    J'avais bien pensé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> [*f3( x ) for x in xrange( 5 )]
    mais ça ne marche pas...
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum([(a,a+1) for a in xrange( 5 )],())

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je trouvais la 1ère question limpide, mais je ne comprends pas la seconde.

    Est-ce que tu veux savoir comment on passe de [(0, -11), (-2, -8), (2, -3), (18, 4), (52, 13)] à [0, -11, -2, -8, 2, -3, 18, 4, 52, 13]???

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Personnellement, je n'essaierais pas de le faire par compréhension de liste. Avec des listes 'conventionnelles', c'est plus facile et plus clair

    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
    def f1(i):
        return i
     
    def f2(i):
        # square
        return i * i
     
    def f3(i):
        # cube
        return i * i * i
     
    def createList(indexes, hooks):
        retlist = []
        for index in indexes:
            for hook in hooks:
                retlist.append(hook(index))
        return retlist
     
    print createList(range(10), [f1, f2, f3])

  8. #8
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Merci josmiley, ta solution avec sum est celle qui se rapproche le plus de ce que je cherchais.

    Toutefois je regrette qu'une syntaxe à la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [*f3( x ) for x in xrange( 5 )]
    ne fonctionne pas. Ça me paraîtrait logique...

    Le pire, c'est que j'avais déjà posté une question de ce genre il y a quelques mois...
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  9. #9
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    En fait, pfeuh, ta super fonction createList peut se résumer à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum( [[f1(x),f2(x),f3(x)] for x in xrange( 10 )],[] )
    Personnellement, je trouve ça plus clair... mais évidemment, tous les goûts sont dans python
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  10. #10
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par sopsag Voir le message
    En fait, pfeuh, ta super fonction createList peut se résumer à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum( [[f1(x),f2(x),f3(x)] for x in xrange( 10 )],[] )
    Personnellement, je trouve ça plus clair... mais évidemment, tous les goûts sont dans python
    Du coup, je viens de découvrir la fonction sum

  11. #11
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Bonjour,

    Voila une solution (j'utilise plutôt les indices de la liste que les éléments mais bon...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    l=[(0, -11), (-2, -8), (2, -3), (18, 4), (52, 13)]
    print [l[t][e]  for t in range(len(l)) for e in [0,1]]
    ce qui fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [0, -11, -2, -8, 2, -3, 18, 4, 52, 13]
    Une fonction générale étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [l[t][e]  for t in range(len(l)) for e in range(len(l[0]))]

  12. #12
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Merci alexdev, encore une syntaxe que je ne connaissais pas et qui me semble plus judicieuse que sum() En plus, c'est très compréhensible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def f1(i):
        # double
        return i * 2
     
    def f2(i):
        # square
        return i * i
     
    def f3(i):
        # cube
        return i * i * i
     
    print [f(i) for i in range(10) for f in [f1, f2, f3]]

  13. #13
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    S'il s'agit de "mettre à plat" une liste de tuples, je préfère pour ma part utiliser une fonction générale de mise à plat d'un arbre (une liste de listes ou de tuples quelque soit sa profondeur):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def aplatliste(L):
        R = []
        for elem in L:
            if isinstance(elem, (list, tuple)):
                R.extend(aplatliste(elem))
            else:
                R.append(elem)
        return R
    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    L = [1,2,3,(4,5,(8,9),6),7]
    print aplatliste(L)
    [1, 2, 3, 4, 5, 8, 9, 6, 7]
    Et pour revenir au cas traité ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    L = [(0, -11), (-2, -8), (2, -3), (18, 4), (52, 13)]
    print aplatliste(L)
    [0, -11, -2, -8, 2, -3, 18, 4, 52, 13]
    Tyrtamos

    Edit: sinon, en se limitant à la liste de tuples donnée, la solution la plus courte en list compréhension me semble être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    L = [(0, -11), (-2, -8), (2, -3), (18, 4), (52, 13)]
    print [x for T in L for x in T]
    [0, -11, -2, -8, 2, -3, 18, 4, 52, 13]
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  14. #14
    Membre averti Avatar de alexdevl
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 265
    Points : 344
    Points
    344
    Par défaut
    Ha très bien il me semblait qu'il existait quelque chose comme ceci
    Mais je n'arrivais pas à trouver tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x for T in L for x in T]
    ,
    J'inversais les ''for''..
    Merci à Tyrtamos

    Alex

Discussions similaires

  1. parcours d'une liste par paires, quelques solutions
    Par genemartin dans le forum Général Python
    Réponses: 0
    Dernier message: 18/05/2013, 11h13
  2. Trier une liste contenant une paire ?
    Par Muetdhiver dans le forum C++
    Réponses: 6
    Dernier message: 01/04/2009, 22h42
  3. comment afficher par paire le resultat de 2 requetes?
    Par gilbertbicot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/02/2009, 16h06
  4. Marquer les doublons par paire
    Par Cercle dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/10/2008, 12h31
  5. Tableau par pair
    Par Haknaton dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 15/12/2006, 13h04

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