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 :

Tri d'une liste de tuples et itertools


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut Tri d'une liste de tuples et itertools
    Bonjour,

    Désirant générer la liste suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(2, 0), (3, 0), (4, 0), (2, 1), (3, 1), (4, 1), (2, 2), (3, 2), (4, 2), (2, 3), (3, 3), (4, 3)]
    j'ai essayé le module product d'itertools :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from itertools import product
    def construire1():        
            return list(product(range(2,5), range(4)))
    print(construire1())
    mais cela me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
    J'aurai aimé utiliser directement un 'outil' d'itertools.

    J'ai trouvé cela pour trier ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from operator import itemgetter
    l1 = construire1()
    l1.sort(key=itemgetter(1))
    print(l1)
    Bien sûr, je peux aussi utiliser la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def construire2():
        maliste = []
        for j in range(4):        
            for i in range(2,5):
                a = (i,j)
                maliste.append(a)
        return maliste
    print(construire2())
    [(2, 0), (3, 0), (4, 0), (2, 1), (3, 1), (4, 1), (2, 2), (3, 2), (4, 2), (2, 3), (3, 3), (4, 3)]
    mais ce n'est pas mon questionnement.

    Quelqu'un peut-il m'aider ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    Lisez la documentation de product:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    |  Cartesian product of input iterables.  Equivalent to nested for-loops.
    |
    |  For example, product(A, B) returns the same as:  ((x,y) for x in A for y in
    ).
    |  The leftmost iterators are in the outermost for-loop, so the output tuples
    |  cycle in a manner similar to an odometer (with the rightmost element changin
     
    |  on every iteration).
    |
    Si vous écrivez cela à la console dans votre cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> [ (x, y) for x in [2, 3, 4] for y in [0, 1, 2, 3]]
    [(2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1),
     (4, 2), (4, 3)]
    >>>
    Pour changer l'ordre, il faut permuter les boucles y et x:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [ (x, y) for y in [0, 1, 2, 3] for x in [2, 3, 4] ]
    [(2, 0), (3, 0), (4, 0), (2, 1), (3, 1), (4, 1), (2, 2), (3, 2), (4, 2), (2, 3),
     (3, 3), (4, 3)]
    De façon générale, une bibliothèque comme itertools évite d'avoir à recoder des trucs triviaux à chaque fois.... Mais si les fonctions proposées ne font pas ce que vous attendez, il faut mettre les mains dans le cambouis pour "coder" çà soi-même.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    Merci, en fait, il fallait faire la même inversion que ce que j'avais fait avec les boucles for.

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

    Il y a une solution très simple: un double tri. On trie d'abord sur le 1er élément du tuple, puis sur le 2ème (j'ai mélangé la liste donnée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x = [(4, 1), (2, 3), (3, 0), (2, 2), (2, 1), (3, 3), (3, 1), (2, 0), (4, 0), (4, 2), (4, 3), (3, 2)]
    x.sort(key=lambda v:v[0])
    x.sort(key=lambda v:v[1])
    print(x)
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [(2, 0), (3, 0), (4, 0), (2, 1), (3, 1), (4, 1), (2, 2), (3, 2), (4, 2), (2, 3), (3, 3), (4, 3)]

  5. #5
    Membre averti Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    Février 2015
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : Février 2015
    Messages : 26
    Par défaut
    Merci Tyrtamos
    C'est simple et efficace.

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

Discussions similaires

  1. [SQL] Tri d'une liste!!!
    Par frutix dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/02/2006, 10h00
  2. [Requête] Tri via une liste déroulante
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2006, 18h16
  3. Tri d'une liste d'objet CObList
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 13/07/2005, 13h50
  4. [TRI] tri d'une list provenant de LabelValueBean
    Par Canou dans le forum Struts 1
    Réponses: 6
    Dernier message: 20/09/2004, 14h55
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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