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 :

Comment créer un classement à partir d'une liste


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Comment créer un classement à partir d'une liste
    Bonjour j'ai fait ce code qui permet d'afficher le nombre de but marqué ou encaissé et le goal average par rapport à une data, j'aimerai créer une fonction qui classe les équipes par rapport à leur goal average mais je sais pas comment faire et quel serais la meilleur solution, si c'est plus simple avec une liste ou un dictionnaire, merci de votre aide.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #importation
    import csv
     
    #Fonction
    csvfile = open ("ligue1.data", "rb")
    lines = csv.reader(csvfile)
    ListeClub = ["Ajaccio","Bastia","Bordeaux","Evian","Guingamp","Lille","Lorient","Lyon","Marseille","Monaco","Montpellier","Nantes","Nice","Paris","Reims","Rennes","Saint-Etienne","Sochaux","Toulouse","Valenciennes"]
    ClassementGoalAverage=[]
    y = 0
     
     
    #But marque
     
    def ButMarqueDomicile(y,DesLignes,UneListe):
         csvfile = open ("ligue1.data", "rb")
         DesLignes=csv.reader(csvfile)
         UneListe=ListeClub
         pointeur_liste=ListeClub.index(y)
         sommebutdomicile = 0
         k = 0
         for row in DesLignes:
              if row[1] == ListeClub[pointeur_liste]:
                   k = int(row[3])
                   sommebutdomicile += k
         return(sommebutdomicile)
     
    def ButMarqueExterieur(y,DesLignes,UneListe):
         csvfile = open ("ligue1.data", "rb")
         DesLignes=csv.reader(csvfile)
         UneListe=ListeClub
         pointeur_liste=ListeClub.index(y)
         sommebutexterieur = 0
         e = 0
         for row in DesLignes:
              if row[2] == ListeClub[pointeur_liste]:
                   e = int(row[4])
                   sommebutexterieur += e
         return(sommebutexterieur)
     
    #but encaisse
     
    def ButEncaisseDomicile(y,DesLignes,UneListe):
         csvfile = open ("ligue1.data", "rb")
         DesLignes=csv.reader(csvfile)
         UneListe=ListeClub
         pointeur_liste=ListeClub.index(y)
         sommebutencaissedomicile = 0
         k = 0
         for row in DesLignes:
              if row[1] == ListeClub[pointeur_liste]:
                   k = int(row[4])
                   sommebutencaissedomicile += k
         return(sommebutencaissedomicile)
     
    def ButEncaisseExterieur (y,DesLignes,UneListe):
         csvfile = open ("ligue1.data", "rb")
         DesLignes=csv.reader(csvfile)
         UneListe=ListeClub
         pointeur_liste=ListeClub.index(y)
         sommebutexterieur = 0
         e = 0
         for row in DesLignes:
              if row[2] == ListeClub[pointeur_liste]:
                   e = int(row[3])
                   sommebutexterieur += e
         return(sommebutexterieur)
     
    #Golaverage
     
    def Golaverage():
         y=input("Entrez le nom d'un club de Ligue 1 :")
         while y not in ListeClub:
              y=input("Entrez le nom d'un autre club de Ligue 1 :")
         a=ButMarqueDomicile(y,lines,ListeClub)
         b=ButMarqueExterieur(y,lines,ListeClub)
         c=ButEncaisseDomicile(y,lines,ListeClub)
         d=ButEncaisseExterieur(y,lines,ListeClub)
         e=a+b
         f=c+d
         return(e-f)
     
    #Classement Goal average
     
    def afficherGoalAverage ():

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je n'y connais rien en "goal-average", mais voilà une idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ListeClub = [["Ajaccio", 12], ["Bastia", 15], ["Bordeaux", 8], ["Evian", 5]]
     
    classement = sorted(ListeClub, key=lambda v: v[1], reverse=True)
     
    print(classement)
     
    [['Bastia', 15], ['Ajaccio', 12], ['Bordeaux', 8], ['Evian', 5]]
    J'ai mis des chiffres au hasard: j'espère qu'Evian ne m'en voudra pas...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En faite je pars d'une data comme celle çi:
    1,Montpellier,Paris,1,1,09/08/2013
    1,Evian,Sochaux,1,1,10/08/2013
    1,Lille,Lorient,1,0,10/08/2013
    1,Valenciennes,Toulouse,3,0,10/08/2013

    en premier on a la journée puis l"équipe à domicile puis l'équipe à l'extérieur, le score et la date.
    Mes fonctions qui calcul le goal average marche mais j'arrive pas classer les équipes de ma liste par rapport mes goal average calculer.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par samcro7 Voir le message
    En faite je pars d'une data comme celle çi:
    1,Montpellier,Paris,1,1,09/08/2013
    1,Evian,Sochaux,1,1,10/08/2013
    1,Lille,Lorient,1,0,10/08/2013
    1,Valenciennes,Toulouse,3,0,10/08/2013

    en premier on a la journée puis l"équipe à domicile puis l'équipe à l'extérieur, le score et la date.
    Mes fonctions qui calcul le goal average marche mais j'arrive pas classer les équipes de ma liste par rapport mes goal average calculer.
    Bonsoir,
    Je ne vois pas trop ce que vos données changent dans l'approche de tyrtamos.
    PS: goal average, ça fait plus "in" que moyenne de but.

    D'autre part, l'utilisation de dictionnaire serait ici, en première approche à exclure: les dictionnaires ne conservent pas l'ordre.

    Clodion

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Dans l'approche de tyrtamos j'ai l'impression que les valeurs de goal average sont connu, alors que je dois les calculés puis une fois que je les conné, je dois faire le classement.
    Par Goalaverage j'entends nombre de but marqué - nombre de but encaissé sur une saison.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par samcro7 Voir le message
    Bonsoir,

    Dans l'approche de tyrtamos j'ai l'impression que les valeurs de goal average sont connu, alors que je dois les calculés puis une fois que je les conné, je dois faire le classement.
    Par Goalaverage j'entends nombre de but marqué - nombre de but encaissé sur une saison.
    Bonsoir,
    Dans son script oui.
    Ce n'est pas très compliqué d'ajouter une colonne et d'y inclure la moyenne de but.
    Il est aussi possible de bien comprendre comment fonctionne la structure indiquée par tyrtamos et de l'adapter à une fonction externe…


    Citation Envoyé par samcro7 Voir le message
    alors que je dois les calculés puis une fois que je les conné, je dois faire le classement.
    Oui, c'est certain. On ne peut les calculer qu'une fois qu'on les connaît et faire le classement ensuite.
    Donc tant que la moyenne de buts n'est pas connue, il n'y a pas de classement!
    Donc aucun problème…

    Clodion

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    @samcro7, je rejoins moi aussi tyrtamos sur sa solution en utilisant le paramètre key= de la fonction sorted(), en revanche je pense que ce qui est réellement bloquant pour formuler une réponse satisfaisante c'est que ton code est vraiment tout pourri

    • tu ouvres plusieurs fois le fichier pour en extraire les mêmes infos
    • tes fonctions font toutes quasiment la même chose, la différence entre les 4 c'est le nom des variables et le numéro de la colonne dans laquelle elles piochent
    • tu passes à tes fonctions des paramètres qui contiennent les mêmes données et pire encore tu ne t'en sers pas dans tes fonctions puisque tu les redéfini à chaque fois

    du coup je te propose cette solution, qui j'espère ne sera pas trop cryptique malgré tout, exit les fonctions, on met tout dans des listes et des dictionnaires accessibles à tout moment :
    Code python : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    import csv
     
    # la liste des champs tels qu'ils apparaissent dans le fichier de données
    champs = ['Journee', 'ClubDomicile', 'ClubExterieur', 'ButsClubDomicile', 'ButsClubExterieur', 'Date']
     
    # on ouvre le fichier, on en fait une liste de dictionnaires, de telle manière qu'on obtient quelque chose comme :
    # [
    #   {
    #     'ButsClubDomicile': '1',
    #     'ClubExterieur': 'Paris',
    #     'ButsClubExterieur': '1',
    #     'Journee': '1',
    #     'Date': '09/08/2013',
    #     'ClubDomicile': 'Montpellier'
    #   }, {
    #     'ButsClubDomicile': '3',
    #   etc.
    # ]
    # note que les champs sont dans le désordre comme disait Clodion, mais ici ca n'est pas un probleme
    datas = [dict(zip(champs, ligne)) for ligne in csv.reader(open('ligue1.data', 'r'))]
     
    # on crée dynamiquement la liste des clubs en les prenant directement dans le fichier, le casting en set() permet d'eliminer les doublons
    # on se retrouve donc avec une liste du genre : ['Lorient', 'Sochaux', 'Toulouse', 'Montpellier', 'Lille', 'Paris', 'Valenciennes', 'Evian']
    ListeClubs = list(set([i['ClubDomicile'] for i in datas] + [i['ClubExterieur'] for i in datas]))
     
    # plutot que d'avoir des fonctions qui retournent le resultat pour 1 club a chaque fois, on crée 4 tableaux (dictionnaires)
    # indexés par le nom du club, du coup ButsMarquesDomicile ressemble à quelque chose comme ça :
    # {
    #   'Lorient': 18,
    #   'Sochaux': 0,
    #   'Toulouse': 0,
    #  etc.
    #   'Evian': 1
    # }
    ButsMarquesDomicile = dict(zip(ListeClubs, [sum([int(i['ButsClubDomicile']) for i in datas if i['ClubDomicile'] == club]) for club in ListeClubs]))
    ButsMarquesExterieur = dict(zip(ListeClubs, [sum([int(i['ButsClubExterieur']) for i in datas if i['ClubExterieur'] == club]) for club in ListeClubs]))
    ButsEncaissesDomicile = dict(zip(ListeClubs, [sum([int(i['ButsClubExterieur']) for i in datas if i['ClubDomicile'] == club]) for club in ListeClubs]))
    ButsEncaissesExterieur = dict(zip(ListeClubs, [sum([int(i['ButsClubDomicile']) for i in datas if i['ClubExterieur'] == club]) for club in ListeClubs]))
     
    # et enfin on crée de la même manière un dictionnaire contenant les goalavg de chaque club, c'est le tableau qu'utilisait tyrtamos pour faire son tri
    # donc on demande la valeur pour un club donné, genre GoalAverage['Valenciennes']
    GoalAverage = dict(zip(listeclubs, [(ButsMarquesDomicile[i]+ButsMarquesExterieur[i])-(ButsEncaissesDomicile[i]+ButsEncaissesExterieur[i]) for i in ListeClubs]))
     
    # et donc le classement, soit une liste qui ressemble à : ['Valenciennes', 'Lille', 'Sochaux', 'Montpellier', 'Paris', 'Evian', 'Toulouse', 'Lorient']
    classement = sorted(ListeClubs, key=lambda x: GoalAverage[x], reverse=True)

    en me basant sur ce fichier de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1,Montpellier,Paris,1,1,09/08/2013
    1,Evian,Sochaux,1,1,10/08/2013
    1,Lille,Lorient,1,0,10/08/2013
    1,Valenciennes,Toulouse,3,0,10/08/2013
    2,Lorient,Valenciennes,18,23,5/09/2014

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/07/2012, 17h43
  2. Créer un dictionnaire à partir d'une liste
    Par jouclar dans le forum Général Python
    Réponses: 7
    Dernier message: 25/04/2012, 22h09
  3. [DOM4J] Créer un Xpath à partir d'une liste
    Par anisse4 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 30/06/2009, 13h03
  4. Réponses: 1
    Dernier message: 14/07/2008, 11h17
  5. comment créer un rpm à partir d'une lib source
    Par kris1 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 06/12/2007, 17h35

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