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 :

Trier une partie de matrice 2d sans utilser numpy [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut Trier une partie de matrice 2d sans utilser numpy
    Bonjour.
    j'ai une matrice MxN d'entiers. Je veux ne trier que la sous-matrice commençant en (i,i) (ne pas prendre en compte les i premières lignes et colonnes)
    Le tri doit s'effectuer sur la i° colonne par ordre décroissant.
    par exemple pour i = 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort_sub_matrix([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],2)
    je veux obtenir :
    [1, 1, 1, 1]
    [2, 2, 2, 2]
    [3, 3, 4, 4]
    [4, 4, 3, 3]

    J'ai codé cette fonction qui fournit le résultat attendu mais je trouve ça bien lourd :
    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 sort_sub_matrix(M, indice):
        M2 = []
        for r in M[indice:]:
            M2.append(r[indice:])
        M2.sort(reverse=True)
        for r_item, r_value in enumerate(M2):
            for c_item, c_value in enumerate(r_value):
                M[r_item + indice][c_item + indice] = c_value
        return M
     
     
    M = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]
     
    for r in M:
        print(r)
    print('')
    M = sort_sub_matrix(M, 2)
    for r in M:
        print(r)
    Bien sûr, c'est sans numpy sinon un coup de slicing et c'est terminé.
    Si quelqu'un a une solution plus élégante, je suis preneur

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut !

    Peut-être comme ça ?
    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
    def sort_sub_matrix(M, indice):
     
        M2 = []
        for r in M[indice:]:
            M2.append(r[indice:])        
        M2.sort(reverse=True)    
     
        for i, row in enumerate(M[indice:]):
            M[indice+i] = row[:indice]+M2[i]
     
        return M
     
     
    M = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]
     
     
    for r in M:
        print(r)
    print('')
     
    M = sort_sub_matrix(M, 1)
    for r in M:
        print(r)
    Voire comme ça, si on comprend le fonctionnement des listes ^^ :
    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
    def sort_sub_matrix(indice):
     
        M2 = []
        for r in M[indice:]:
            M2.append(r[indice:])        
        M2.sort(reverse=True)    
     
        for i, row in enumerate(M[indice:]):
            M[indice+i] = row[:indice]+M2[i]
     
     
     
    M = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]
     
     
    for r in M:
        print(r)
    print('')
     
    sort_sub_matrix(1)
    for r in M:
        print(r)

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Pour le fun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> M = [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]
    >>> i = 2
    >>> z = [ m [i:] for m in M[i:]]
    >>> z.sort(reverse=True)
    >>> for j, m in enumerate(M[i:]): m [i:] = z[j]
    ...
    >>> for e in M: print(e)
    ...
    [1, 1, 1, 1]
    [2, 2, 2, 2]
    [3, 3, 4, 4]
    [4, 4, 3, 3]
    >>>
    mais je ne suis pas sur que le "tri" soit "bon" mais il est "bug compatible" avec l'original.

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

  4. #4
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Merci à tous les 2.
    Le 1° code de Lenarvalo fonctionne parfaitement avec une boucle for en moins que mon code. En revanche, je ne vois pas l’intérêt du 2° code si on veut pouvoir appliquer la fct de tri à plusieurs matrices ...
    Le code de wiztricks ne fonctionne pas pour un autre indice que 2 et même pour l'indice 2 avec une matrice plus quelconque, mais ton code n'est peut-être que de l'humour pythonesque
    Finalement son code fonctionne aussi ...

  5. #5
    Invité
    Invité(e)
    Par défaut
    En revanche, je ne vois pas l’intérêt du 2° code si on veut pouvoir appliquer la fct de tri à plusieurs matrices ...
    Tu peux enlever le return dans ce cas puisqu'il s'agit de listes (l'emplacement mémoire, tout ça, tout ça, j'ai pas le vocabulaire pour expliquer)...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Citation Envoyé par ypcman Voir le message
    Le code de wiztricks ne fonctionne pas pour un autre indice que 2 et même pour l'indice 2 avec une matrice plus quelconque, mais ton code n'est peut-être que de l'humour pythonesque
    Pour moi, si je teste, çà fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> M = [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]]
    >>> i = 1
    >>> z = sorted([ m[i:] for m in M[i:]], reverse=True)
    >>> for j, m in enumerate(M[i:]): m [i:] = z[j]
    ...
    >>> M
    [[1, 1, 1], [2, 4, 4], [3, 3, 3], [4, 2, 2]]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pour moi, si je teste, çà fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> M = [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4]]
    >>> i = 1
    >>> z = sorted([ m[i:] for m in M[i:]], reverse=True)
    >>> for j, m in enumerate(M[i:]): m [i:] = z[j]
    ...
    >>> M
    [[1, 1, 1], [2, 4, 4], [3, 3, 3], [4, 2, 2]]
    >>>
    - W
    Oui tout à fait ! je m'étais trompé en testant ton code qui est remarquablement synthétique

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

Discussions similaires

  1. [XL-2013] Trier une liste par ordre croissant sans macro
    Par licpegpon dans le forum Conception
    Réponses: 7
    Dernier message: 09/12/2019, 11h14
  2. Réponses: 9
    Dernier message: 22/08/2011, 21h58
  3. [Débutant] travailler avec une partie de matrice
    Par Nathaniel_etudiant dans le forum Simulink
    Réponses: 8
    Dernier message: 17/09/2010, 17h06
  4. Supprimer une partie de matrice ne contenant que des 0
    Par jmbonnaz dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/06/2007, 18h03

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