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 :

liste random meilleurs choix


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut liste random meilleurs choix
    Bonjour,
    j'ai un dico qui stocke pour chaque clé une valeur.

    vecteur [num] = valeur



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for num,listevecteur in vecteurPhrase.items():
        for nom,valeur in listevecteur.items():
    	    score += valeur
        vecteur[num] = score
        score = 0
     
    #ensuite je fais un trie sur le dico par valeur :
     
    element = sorted(vecteur.iteritems(), reverse=True, key=operator.itemgetter(1))
    ensuite je veux récupérer les M meilleurs scores
    donc je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for j in element[:numberSentenceSummary]:
       print j
     
    j'obtiens 
    (0, 4)
    (9, 4)
    (19, 4)
    (21, 4)
    (3, 3)
    (8, 3)
    (0, 3) 
     
    avec (0,4) ==> 0:clé 4:score
    le problème dans ma méthode, c'est si je souhaite récupérer les 3 premiers élements , je récupère
    (0, 4)
    (9, 4)
    (19, 4)
    et j'aimerai pouvoir récupérer au hasard les 3 premiers éléments en cas d'égalités de score.

    je sais pas si c'est possible.

    si je demande ça, c'est pour faire plusieurs tests !!

    sachant que le premier indice 0 ou 9 ou 19 correspondent à des numéro de phrase. (c'est pas très important de le savoir, mais c'est au cas où des personnes s'interrogerait sur l'utilité de mon pb) donc d'où l'utilité de pouvoir choisir au hasard les meilleurs phrases dans le cas de score d'égalité.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    La 1ère idée qui me viens à l'esprit, c'est de stocker les scores ajoutés dans une variable et vérifier si on l'a déjà ajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    list_valeur_stocker = []
    list_score = []
    for nom, valeur in element:
        if not valeur in list_valeur_stocker:
            list_score.append((nom, valeur))
            list_valeur_stocker.append(valeur)
        if len(list_score) == 3:
            break
     
    print list_score
    Mais ça n'a rien d'aléatoire. Si tu veux choisir un score au hasard il va falloir utiliser le module random.

    l'idée est de récupérer un dict de forme {4:[0, 9, 19]], 3:[3, 8, 0], ...}, de trier, et de prendre un score aléatoirement.

    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
     
    import random
     
    dict_regroupe = {}
    list_score = []
     
    for nom, valeur in listevecteur.items():
        if not dict_regroupe.has_key(valeur):
            dict_regroupe[valeur] = [nom]
        else:
            dict_regroupe[valeur].append(nom)
     
    keys = dict_regroupe.keys()
    keys.sort()
    keys.reverse()
    for key in keys:
        nbr_aleatoire = random.randint(0, len(dict_regroupe[key])-1)
        list_score.append((dict_regroupe[key][nbr_aleatoire], key))
        if len(list_score) == 3:
            break
     
    print list_score
    Bon c'est un lourd, je pense qu'il y a moyen de faire plus simple.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    bonne idée !!!
    j'étais entrain de mettre un système hyper complexe, mais là en voyant ton message, ça m'aide plus facilement !!!!

    je vais essayer de le mettre en place

    merci

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    A partir de elements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from itertools import groupby
    from operator import itemgetter
    from random import shuffle
     
    # regroupe les éléments de même score en sous-listes
    grouped = [list(g) for k,g in groupby(elements, itemgetter(1))]
    # mélanger chaque sous-liste
    map(shuffle, grouped)
    # aplatir les sous-listes:
    shuffled_elements = sum(grouped, [])

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    sur le coup, j'ai pas fait gaffe.

    mais par ex, dans le cas {4:[0, 9, 19]], 3:[3, 8, 1], ...},

    ce que j'aimerai ce n'est pas juste récupérer un meilleur score.

    Déjà ce que vous faites en regroupant par score, c'est déjà excellent (ce qui va faciliter la suite de mon pb)

    mon but c'est de récupérer les N meilleurs éléments. N est un paramètre.

    par ex,si je souhaite récupérer les 5 (mais ça peut être un autre chiffre) meilleurs éléments.

    Dans l'ex j'ai 6 meilleurs éléments [0, 9, 19] [3, 8, 1]

    Donc les 3 éléments qui ont le score 4, je l'ai conserve, il me reste plus qu'à choisir 2 éléments (pour compléter ma liste des meilleurs éléments) parmi les autres restants.

    c'est ça mon réel pb

  6. #6
    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
    La solution n'est plus très loin: on se rappoche peu à peu d'une exposition du problème correctement énoncé....

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par ekremyilmaz Voir le message
    sur le coup, j'ai pas fait gaffe.
    mais par ex, dans le cas {4:[0, 9, 19]], 3:[3, 8, 1], ...},
    ce que j'aimerai ce n'est pas juste récupérer un meilleur score.
    Déjà ce que vous faites en regroupant par score, c'est déjà excellent (ce qui va faciliter la suite de mon pb)
    mon but c'est de récupérer les N meilleurs éléments. N est un paramètre.
    par ex,si je souhaite récupérer les 5 (mais ça peut être un autre chiffre) meilleurs éléments.
    Dans l'ex j'ai 6 meilleurs éléments [0, 9, 19] [3, 8, 1]
    Donc les 3 éléments qui ont le score 4, je l'ai conserve, il me reste plus qu'à choisir 2 éléments (pour compléter ma liste des meilleurs éléments) parmi les autres restants.
    c'est ça mon réel pb
    Ben t'as essayé mon code ? Il suffit de prendre les N premiers elements du résultat (shuffled_elements) et tu as ta réponse, non ?
    Bien sûr, le code fait un peu trop de travail (il mélange aussi des éléments qui ne seront pas sélectionnés), mais il a l'avantage d'être court...

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/12/2007, 16h17
  2. [PostgreSQL-Firebird/Interbase6]Quel est le meilleur choix?
    Par kedare dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 28/03/2006, 16h30
  3. Une table ou deux - quel est le meilleur choix
    Par DG dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2006, 18h04
  4. Réponses: 3
    Dernier message: 08/10/2005, 00h02
  5. SDBD "Gratuit" : Quel est le meilleur choix ?
    Par ZZZzzz2 dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 30/03/2005, 15h25

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