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 :

un dictionnaire de liste


Sujet :

Python

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut un dictionnaire de liste
    Pour un projet je dois simuler la gestion de différents processus par des processeurs. Ces processus peuvent avoir une priorité qui déterminent leur ordre d'arrivée. Ces priorités peuvent ne pas être entières, j'ai donc choisi de regrouper tous les processus dans un dictionnaire où chaque priorité est une clé vers la liste de tous les processus ayant cette priorité. Je l'ai implémenté de cette manière :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fileProc = {}
     def addProc(self) :
            q = ProcessusPrio(p) #j'initialise un processus avec priorité
            if q.getPrio() in fileProc.keys : #je teste si la priorité sert déjà de clé
                fileProc[q.getPrio()] += [q] #si oui j'ajoute le processus à la liste
            else :
                fileProc[q.getPrio()] = [q] #sinon je la créé

    y a t il une solution plus condensée de le faire. J'avais pensé à :
    fileProc[q.getPrio()] = q.getPrion() in fileProc.keys and + [q] or [q]

    Mais ça me parait fumeux et même faux.

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Éventuellement avec dict.get*:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fileProc = {}
    def addProc(self) :
        q = ProcessusPrio(p) #j'initialise un processus avec priorité
        # get accepte une valeur par défaut, ici une liste vide, []…
        fileProc.get(q.getPrio(), []).append(q)

    Question subsidiaire*: il sort d’où, “p”*?

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut
    le p est un processus sans priorité que je convertie en processus avec priorité, je l'ai pas mis pour alléger le code qui à l'origine donnait ça :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FileProc = []
    fileProc = {}
    def addProc(self) :
            p = Processus()
            self.FileProc.append(p)
            q = ProcessusPrio(p)
            if q.getPrio() in fileProc.keys :
                fileProc[q.getPrio()] += [q]
            else :
                fileProc[q.getPrio()] = [q]

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Éventuellement avec dict.get:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fileProc = {}
    def addProc(self) :
        q = ProcessusPrio(p) #j'initialise un processus avec priorité
        # get accepte une valeur par défaut, ici une liste vide, []…
        fileProc.get(q.getPrio(), []).append(q)
    Je ne pense pas que ça marche (fileProc reste vide car get n'affecte pas fileProc).
    A mon avis, il faut utiliser setdefault

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fileProc = {}
    def addProc(self) :
        q = ProcessusPrio(p) #j'initialise un processus avec priorité
        # get accepte une valeur par défaut, ici une liste vide, []…
        fileProc.setdefault(q.getPrio(), []).append(q)

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Hmmm…

    Où est la cave, que j’aille m’y faire oublier*?

  6. #6
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut
    Merci je vais voir ça

    j'ai un autre problème j'ai ecrit mon projet sur mac (avec komodo) et au moment de faire tourner le script j'ai ce message d'erreur dans la console : SyntaxError: Non-ASCII character '\x8f' in file projet1.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details.

    L'interpréteur n'arrive pas à lire le caractère # (pour les commentaires. Je ne comprends pas, cette erreur aurait du etre réglée avec python 3 que j'utilise. Toujours est il que je ne sais pas quel encodage utiliser pour qu'il arrive à le lire et puis aussi la ligne stipulant l'encodage doit commencer par # mais si on ne peut pas la lire .....

  7. #7
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Tout d’abord, cette erreur signifie à mon avis que tu tournes en python 2.x

    Ensuite, 0x8F n’est pas # (c’est 0x23), mais un obscure caractère de contrôle Unicode –*je serais toi, je vérifierais que ce komodo n’ajoute pas des trucs bizarres à ton fichier…

    Quant à l’encodage, normalement c’est utf-8

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut
    J'ai téléchargé (et installé python 3) de plus il doit bien s'agir du # puisque quand j’enlève la première ligne de commentaire il indique l'erreur à la ligne de commentaires d'après et que quand je supprime les commentaires ça tourne sans problème. Mais un code sans commentaire c'est vraiment imbuvable (surtout que je dois le rendre à un prof)

  9. #9
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Franchement, je doute beaucoup que ce soit le # –*c’est un caractère ASCII des plus standard*!

    Peux-tu coller ton fichier .py tel que produit par ton éditeur sur un site quelconque (pasteall.org, au hasard ), ou le mettre en pièce jointe*?

    Sinon, je ne connais pas vraiment python sous Windows, mais si tu as installé python3 alors que tu avais déjà python2, il est possible que ce dernier n’ait pas été effacé, et que la commande «*python*» soit toujours liée à python2 (c’est le cas sous Linux, en tout cas…)*?

  10. #10
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut
    Trouvé le problème vient des accents dans les commentaires

  11. #11
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    Par défaut
    Pour pouvoir écrire en dur des caractères UTF-8,
    Il faut le spécifier dans le code via la ligne # -*- coding: utf-8 -*- (à mettre en début des sources)

  12. #12
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Encore une fois, ceci n’est vrai que pour python2 –*python3 étant nativement unicode, plus besoin de cette directive

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Par défaut
    Bonjour,

    Je ne vais faire que confirmer ce qu'a dit mont29, mais quand je lit qu'il est impossible de mettre des accents dans des commentaires, ça me provoque de l’urticaire.

    Il est clair, en voyant ton message d'erreur, que tu utilise Python 2. Ce n'est pas le tout d'installer Python 3, mais il faut aussi l'utiliser. Par defaut, comme avec Linux, je crois bien que Osx utilise Python 2.x (il ne faut surtout pas le supprimer). Je ne connais ni Komodo, ni les Mac mais il faut que tu t'assures d'utiliser la bonne version.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    print(sys.version)


    Pour en revenir à ton message d'erreur et si tu assumes le fait d'utiliser la version 2 de Python (bouhh ! la honte ! ), il y a fort à parier que Komodo écrit des fichiers aux format UTF-8 avec BOM et c'est donc pour ça que Python 2 t'insulte lorsqu'il lit les premiers caractères (le BOM) et non le dièse ou les accents.

    Voilà, juste histoire de remettre quelques points sur quelques i...

  14. #14
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Bonjour,

    Je rebondis sur le 1er sujet de ce post. Utiliser les priorités comme clefs du dictionnaire me semble une mauvaise idée:
    * Pourquoi interdire à 2 process d'avoir la même priorité ?
    * Je crois que utiliser des floats en tant que clef est dangereux car l'égalité de 2 floats est relative à la précision.

  15. #15
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Bonjour,

    Je rebondis sur le 1er sujet de ce post. Utiliser les priorités comme clefs du dictionnaire me semble une mauvaise idée:
    * Pourquoi interdire à 2 process d'avoir la même priorité ?
    Ce n’est pas interdit, puisque qu’à chaque priorité correspond une liste de processus*!

    Citation Envoyé par VV33D Voir le message
    * Je crois que utiliser des floats en tant que clef est dangereux car l'égalité de 2 floats est relative à la précision.
    Certes, mais ici ça n’a aucune importance, à mon avis –*si un processus a une priorité 1e-10 plus élevée qu’un autre, il ajoutera simplement une clé supplémentaire au dict, c’est tout…

    Éventuellement, on pourrait avoir recours à un truc genre multiplication par une constante quelconque, puis conversion en int, si jamais ça posait effectivement problème.

  16. #16
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 136
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Encore une fois, ceci n’est vrai que pour python2 –*python3 étant nativement unicode, plus besoin de cette directive
    Effectivement j'ai téléchargé python 3 mlais c'est toujours python 2 qui se lance avec la commande python. J'avais pas changé le /usr/bin/python (parfois c'est cool unix mais parfois c'est con )

    Citation Envoyé par VV33D Voir le message
    Bonjour,

    Je rebondis sur le 1er sujet de ce post. Utiliser les priorités comme clefs du dictionnaire me semble une mauvaise idée:
    * Pourquoi interdire à 2 process d'avoir la même priorité ?
    * Je crois que utiliser des floats en tant que clef est dangereux car l'égalité de 2 floats est relative à la précision.
    J'ai besoin des priorités comme index du dictionnaire parce que c'est beaucoup plus simple pour trouver le premier processus avec la plus haute priorité comme ça (les priorités peuvent être des double). Et mont29 a très bien répondu pour moi : (à noter que les processus rentrent avec une priorité entière et qu'à chaque fois qu’ils sont élu leur prio augmentent d'un nombre réel déterminé par l'utilisateur donc plutôt 0.1 que 1^-10 dans ce cas pas de problème avec la précision (mais j'y avais pensé et d'en d'autres cas ça pourrait être embêtante).

  17. #17
    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
    Je profite du rebond pour dire que l'utilisation d'un dictionnaire pour gérer les priorités m'a aussi choqué, cela me semble inefficace et inadapté. En quoi le fait de trouver le processus de plus haute priorité est facilité par cette structure ? Je ne vois vraiment pas... Une simple liste triée (avec insertion dans l'ordre avec le module bisect) serait déjà nettement plus efficace, et une implémentation de file de priorité (avec le module heapq) le serait encore plus.

Discussions similaires

  1. Dictionnaire de liste -> liste de dictionnaire
    Par ju_bicycle dans le forum Général Python
    Réponses: 8
    Dernier message: 01/07/2009, 12h43
  2. Encore ce dictionnaire de listes
    Par Victoria007 dans le forum Général Python
    Réponses: 10
    Dernier message: 15/05/2008, 22h39
  3. Dictionnaire de listes
    Par Victoria007 dans le forum Général Python
    Réponses: 3
    Dernier message: 05/05/2008, 15h35
  4. Dictionnaire et liste de mot
    Par cinette dans le forum Services
    Réponses: 0
    Dernier message: 30/04/2008, 18h47
  5. Problème "for" dans dictionnaire de liste
    Par Sayrus dans le forum Général Python
    Réponses: 3
    Dernier message: 15/02/2006, 16h35

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