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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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 !

  2. #2
    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,

    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

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    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 : 952
    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 confirmé 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
    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...

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum([(a,a+1) for a in xrange( 5 )],())

  6. #6
    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
    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

  7. #7
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    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 : 952
    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 confirmé 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
    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...

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