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 avancé dans une liste imbriquée [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut Tri avancé dans une liste imbriquée
    Bonjour, je suis nouveau et j'aurais besoin d'aide sur une fin de projet, j'ai actuellement une fonction qui me trie une liste suivant l'age inverse des personnes grace a la fonction sorted depuis une liste imbriquée (1 liste dans l'autre), toutefois je voudrais le faire sans utiliser des fonctions de type sort ou sorted.

    C'est a dire qu'en clair je voudrais le faire a la main, sans que "sort" n'apparaisse



    La partie concernée est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from datetime import datetime
    liste = [['WILSON', 'MIKE', 'H', '26/06/1950'], ['EMERIC', 'JAMES', 'H', '27/06/1960'], ['MOPAL', 'ARTHUR', 'H', '27/06/1966']]
    def agepersonne():
           print(sorted(liste, key=lambda item: datetime.strptime(item[3], '%d/%m/%Y'), reverse=True))
    agepersonne()


    Au final le résultat est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    [['MOPAL', 'ARTHUR', 'H', '27/06/1966'],
     ['EMERIC', 'JAMES', 'H', '27/06/1960'],
     ['WILSON', 'MIKE', 'H', '26/06/1950']]
    Ce qui est tout a fait correct par rapport a ce que je souhaite, sauf que je n'arrive pas a le faire " a la main... " .

  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,

    Citation Envoyé par Whisper40 Voir le message
    Ce qui est tout a fait correct par rapport a ce que je souhaite, sauf que je n'arrive pas a le faire " a la main... " .
    Vous trouverez sans trop de difficultés un algorithme de tri avec un peu de recherche sur Internet. Vous aurez peut être des difficultés à la coder en Python mais si vous ne postez pas le code que vous avez essayé de faire, on ne va pas pouvoir vous aider ("sort" nous va très bien).

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

  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,

    Juste un petit coup de pouce.

    Une petite fonction de tri "insertion" (Python 3). Ce n'est pas le plus rapide des algo de tri, mais il est déjà pas mal et assez simple à comprendre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def triInsertion(L):
        for i in range(1, len(L)):
            if L[i] < L[i-1]:
                for k in range(0, i):
                    if L[i] < L[k]:
                        X = L.pop(i)
                        L.insert(k, X)
                        break
    Pour adapter cette fonction au problème posé, il faut:
    - que la comparaison se fasse avec le 4ème élément (indice=3) de chaque sous-liste (ex: L[i] devient L[i][3])
    - que chaque date de type '27/06/1966' soit transformée en '19660627' pour que le tri alphabétique coïncide avec le tri chronologique (ex: date => date[6:11] + date[3:5] + date[0:2])
    - tenir compte du fait qu'on cherche ce tri en inverse.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut
    Merci pour ta partie de code, malheureusement je l'avais déja vu et essayé mais bon xD

    Modification, la date est saisie par l'utilisateur de cette manière : "19660627"
    J'ai légèrement modifié le code, avec inversion du site < dans le boucle for i.
    Par contre je ne vois pas du tout comment m'occuper du trie de la date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    L = [['WILSON', 'MIKE', 'H', '19500626'], ['EMERIC', 'JAMES', 'H', '19600626'], ['MOPAL', 'ARTHUR', 'H', '19660627']]
    def triInsertion(L):
        for i in range(len(L)):
            if L[i][3] > L[i-1][3]:
                for k in range(0, i):
                    if L[i] < L[k]:
                        X = L.pop(i)
                        L.insert(k, X)
                        break
        return L
     
    triInsertion(L)

  5. #5
    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
    Non. Tu corriges au pif, et tu n'y arriveras pas comme ça.

    Essai de comprendre l'algorithme (fais un dessin sur papier et simule son déroulement) et tu sauras comment le modifier.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2017
    Messages : 124
    Par défaut
    Je comprends le principe du programme qui a pour but de placer "une date" en fonction des autres, pour cela il analyse la liste afin de placer "une date" au bon endroit afin de garder la liste triée a chaque ajout.

    Entre temps j'ai préféré modifier le code tout en gardant le principe de base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    L = [['WILSON', 'MIKE', 'H', '19700626'], ['EMERIC', 'JAMES', 'H', '19670626'], ['MOPAL', 'ARTHUR', 'H', '19660627']]
    def trie(L):
        for i in range(1, len(L)):  
            temporaire=L[i]
            j = i - 1 
            while   j >=0 and L[j] > temporaire: 
                L[j+1] = L[j]
                j -= 1
            L[j+1] = temporaire
        return L
    print(trie(L))
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    [['EMERIC', 'JAMES', 'H', '19670626'], ['MOPAL', 'ARTHUR', 'H', '19660627'], ['WILSON', 'MIKE', 'H', '19700626']]
    Donc il a trié les personnes suivant leur nom dans un ordre alphabétique, j'ai essayé diverses méthodes pour enlever les [[',']] et faire un retour a la ligne après chaque personne mais sans succés..
    J'aurais aussi aimé enlever les informations après le prénom, afin d'avoir un résultat du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EMERIC JAMES
    MOPAL ARTHUR
    WILSON MIKE
    Si vous savez comment faire je suis preneur..

    Et bien sur j'ai encore une fois essayer de comprendre comment gérer les dates mais je suis désolé ce n'est pas compréhensible pour ma part..
    Je n'ai pas d'idée comment m'en sortir avec une variable qui contient YYYYMMJJ..
    Merci

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

Discussions similaires

  1. Trie multiple dans une liste
    Par triv69 dans le forum C#
    Réponses: 1
    Dernier message: 03/11/2017, 13h55
  2. Insertion triée efficace dans une List<T>
    Par olibara dans le forum C#
    Réponses: 4
    Dernier message: 11/10/2009, 23h43
  3. Réponses: 3
    Dernier message: 08/07/2008, 10h24
  4. Réponses: 0
    Dernier message: 20/09/2007, 17h10
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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