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 de liste en python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut Tri de liste en python
    Bonjour!!!
    J'ai une liste de ce type a trier :

    Liste = [("A",4),("B",3),("C",2),("D",2),("E",2),("F",2),("G",1),("H",1),("D",1)]

    Cette liste represente, par exemple, le nombre d'occurence de chaque lettre dans un texte : si l'utilisateur tape occurence(texte,k) : la fonction retourne les K lettres les plus abondantes dans le texte, donc dans ma liste qui compte le nombre d'occurence de chaque lettre ( j'ai deja ecrit un fonction qui fait ca et qui en plus les trie par ordre croissant).

    donc, j'ai ecrit cette fonction :



    Code :

    occurence(texte,k):
    ListeTriee=[]
    ListeRetour=[]
    Liste= [("A",4),("B",3),("J", 3) , ("C",2),("D",2),("E",2),("F",2),("G",1),("H",1),("D",1)]
    print Liste
    for i in range(len(Liste)):
    while i<range(len(Liste)):
    if Liste[i][1] != Liste[i+1][1] and j<k :
    ListeRetour.append(Liste[i+1])
    j=j+1
    elif Liste[i][1] == Liste[i+1][1]:
    ListeRetour.append(Liste[i+1][1])
    return ListeRetour
    En fait, je voulais un resultat sous forme de liste, qui renvoi les k lettres les plus abondante, et que si plusieurs lettres ont la meme occurence, elles doivent etre inserée dans la liste jusqu'a ce que on est les K lettre les plus abondantes :

    Par exemple, ici, si l'utilisateur tape
    occurence('texte',3), on doit avoir [ "A","B","J"]

    Ma fonction ne marche pas ... Quelqu'un aurait il la gentillesse de m'aider ?
    Merci.

  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,

    On n'a pas besoin de trier pour extraire les lettres dont l'occurrence est supérieure ou égale à une valeur donnée n. Mais, bien sûr, dans ce cas, la liste résultat respecte l'ordre de la liste initiale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Liste = [("A",4),("B",0),("C",2),("D",1),("E",2),("F",3),("G",1),("H",5),("D",1)]
     
    n = 3
    print [lettre for lettre, nombre in Liste if nombre>=n]
    ['A', 'F', 'H']
    On peut même fabriquer une fonction qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    freqlettre = lambda n, Liste: [lettre for lettre, nombre in Liste if nombre>=n]
     
    print freqlettre(n, Liste)
    ['A', 'F', 'H']
    Mais si tu veux trier, voilà comment faire: il faut créer une fonction de comparaison et utiliser la méthode sort() de Python. Ici, on trie dans l'ordre décroissant du nombre d'occurrences:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def compfreq(elem1,elem2):
        if elem1[1]<elem2[1]:
            return -1
        if elem1[1]>elem2[1]:
            return 1
        return 0
     
    Liste.sort(compfreq, reverse=True)
     
    print Liste
    [('H', 5), ('A', 4), ('F', 3), ('C', 2), ('E', 2), ('D', 1), ('G', 1), ('D', 1), ('B', 0)]
    [et utilise les tag de code: python sans indentation est incompréhensible]

    Tyrtamos

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    J'ai du mal m'exprimer, en fait dans votre exemple , n correspond " au nombre de fois où elles apparaissent" et moi ce que je veux c'est que n corresponde aux "n lettres les plus abondantes"

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    C'est pour cela que j'ai cree une fonction qui me les met dans l'ordre en fonction de leur nombre d'occurence ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def occurence(texte,k):
    ListeTriee=[]
    ListeRetour=[]
    Liste= [("A",4),("B",3),("J", 3) , ("C",2),("D",2),("E",2),("F",2),("G",1),("H",1),("D",1)]
    print Liste
    for i in range(len(Liste)):
     while i<range(len(Liste)):
      if Liste[i][1] != Liste[i+1][1] and j<k :
       ListeRetour.append(Liste[i+1])
       j=j+1
     elif Liste[i][1] == Liste[i+1][1]:
      ListeRetour.append(Liste[i+1][1])
     return ListeRetour

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour !!! Bienvenue



    Dans ton code le compteur est manifestement j, mais il n’est pas initialisé.



    Les deux lignes suivantes, bien qu’un peu différentes, sont redondantes:

    for i in range(len(Liste)):
    while i<range(len(Liste)):


    Il faut choisir: soit on boucle avec while, soit avec for.




    Si i parcourt range(len(Liste)) , il y aura un problème pour i==len(Liste)-1 , repérant le dernier élément, car alors i+1 vaudra len(Liste) c’est à dire erreur “index out of range“ pour Liste[i+1]

    D’où nécessité de boucle for i in range(len(Liste)-1) et faire un test supplémentaire après sortie de la boucle.





    Mais il y a un autre problème dans ton code: tu ne fais append() que sur un élément en i+1 , donc, comme i commence à 0, tu enregistres à partir de l’élément 1: le premier élément est oublié.


    Il faut donc en fait revoir ton algorithme de façon un peu notable.

    Au lieu de faire un test par rapport à l’élément suivant il faut comparer l’élément d’index i envisagé avec ce qui le PRÉCÈDE.


    Le code suivant , avec cette correction mais dans l’esprit du tien, marche.
    Mais je posterai plus tard un code amélioré sur certains points.

    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
    Liste= [("A",4),("B",3),("J", 3) , ("C",2),("D",2),("E",2),("F",2),("G",1),("H",1),("D",1)]
    print Liste
     
    ListeRetour=[]
    j = 0
    k = 3
    frequ_prec = 0
    for i in range(len(Liste)):
        if Liste[i][1] != frequ_prec:
            if j<k :
                ListeRetour.append(Liste[i][0])
                j=j+1
            else:
                break
        else:
            ListeRetour.append(Liste[i][0])
    print ListeRetour

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci beaucoup d'avoir regardé !
    Votre programme fonctionne pour k=3, mais si on met k=4, il nous sort seulement "C", alors qu'il devrait y avoir egalement "D", "E", "F", qui ont la meme occurence que "C", et c'est justement cela mon problème et la raison de mon post ...

Discussions similaires

  1. Requête, tri sur liste de choix
    Par seb.kepka dans le forum Access
    Réponses: 1
    Dernier message: 15/05/2006, 14h47
  2. Algo de tri par liste chainée
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 30/12/2005, 14h05
  3. quel est le meilleur algo de tri de liste ?
    Par sony351 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/07/2005, 02h00
  4. [langage] tri avancé, liste de listes
    Par schnecke dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2004, 14h00
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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