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 sur une matrice ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 7
    Par défaut Tri sur une matrice ?
    Bonjour à tous
    J'ai fait ma rentrée e nclasse préparatoire cette année et je n'ai donc commencé a apprendre à coder en python que récemment, la question va donc surement paraître stupide: est-il possible de trier une matrice selon un ligne, de telle sorte que la premiere par exemple soit dans l'ordre décroissant mais que les coefficients de la deuxieme reste "sous" leur coefficients d'origine ?
    Par exemple comment transformer ceci :
    [[1,0,0,4,2]
    [1,2,3,4,5]]
    en cela:
    [[4,2,1,0,0]
    [4,5,1,2,3]] ?
    d'avance merci et bonnes fêtes !

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    ta matrice ici est en fait une liste de -deux- listes, une méthode peut consister à appairer les valeurs dans un premier temps avec zip :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> l = [[1,0,0,4,2],[1,2,3,4,5]]
    >>> zip(*l)
    [(1, 1), (0, 2), (0, 3), (4, 4), (2, 5)]
    ensuite on triera avec comme critère de tri la première valeur de chaque couple (key = lambda x:x[0]), et de manière décroissante (reverse = True) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> sorted(zip(*l), key=lambda x:x[0], reverse=True)
    [(4, 4), (2, 5), (1, 1), (0, 2), (0, 3)]
    reste à remettre ça en forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> zip(*sorted(zip(*l), key=lambda x:x[0], reverse=True))
    [(4, 2, 1, 0, 0), (4, 5, 1, 2, 3)]
    >>> [list(i) for i in zip(*sorted(zip(*l), key=lambda x:x[0], reverse=True))]
    [[4, 2, 1, 0, 0], [4, 5, 1, 2, 3]]

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

    Je propose une solution que j'ai déjà utilisée et qui est valable pour un tableau quelconque dont les sous-listes ont la même longueur: on passe par l'intermédiaire d'un tableau d'index.

    Ici, on va calculer les index de la 1ère sous-liste L[0] (=> [1,0,0,4,2]):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    L = [[1,0,0,4,2], [1,2,3,4,5]]
     
    ind = list(range(len(L[0]))) # => [0, 1, 2, ...]
    ind.sort(key=lambda i: L[0][i], reverse=True)
     
    print(ind)
    [3, 4, 0, 1, 2]
    On a obtenu les index pour savoir dans quel ordre il faut prendre les éléments de L[0] pour les obtenir correctement triés. On voit bien que L[0][ind[0]] => 4, L[0][ind[1]] => 2, L[0][ind[2]] => 1, etc...

    Maintenant, on va trier toutes les sous-listes de L avec cet index:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L = [[elem[ind[i]] for i in range(len(elem))] for elem in L]
     
    print(L)
    [[4, 2, 1, 0, 0], [4, 5, 1, 2, 3]]
    Ce qui donne bien le résultat voulu.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 7
    Par défaut
    Merci beaucoup à tous les deux !
    Je préfère la première méthode, plus simple visuellement pour l'instant, mais peut être n'est-ce qu'un avis de débutant
    Il me reste bien du chemin à faire en tous cas à ce que je vois !
    Bonne année à tous!

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

Discussions similaires

  1. Suppression d'une dimension sur une matrice
    Par damleg dans le forum MATLAB
    Réponses: 6
    Dernier message: 03/04/2007, 14h59
  2. Réponses: 16
    Dernier message: 10/11/2005, 22h51
  3. tri sur une partie d'un champ
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2005, 11h25
  4. [JSP] tri sur une colonne
    Par soony dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/07/2005, 15h02
  5. référencement sur une matrice
    Par bni dans le forum C++
    Réponses: 3
    Dernier message: 24/03/2005, 00h06

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