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 :

Travailler avec un dictionnaire


Sujet :

Python

  1. #1
    Membre averti
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Par défaut Travailler avec un dictionnaire
    Salut à tous,

    J'essaye de travailler avec un dictionnaire pour plus de rapidité, mais je suis confronté à un problème ... .

    Je m'explique, j'ai rempli ce dictionnaire (c'est un très très court extrait) :

    dico={..., (165, 45): 27165, (458, 57): 34658, (520, 52): 31720, (98, 0): 98, (151, 14): 8551, (444, 116): 70044, (84, 211): 123636, (377, 79): 47777, (31, 564): 245482, (469, 423): 212496, (363, 108): 65163, (1, 737): 276513, (40, 153): 91840, (349, 177): 106549, (95, 445): 218849, (26, 340): 178085, (411, 274): 151284, (36, 662): 263659, (37, 372): 191052, (23, 161): 96623, (62, 665): 264210, (581, 375): 192638, (536, 596): 251831, (302, 104): 62702, (32, 604): 253253, (235, 199): 118095, (272, 75): 45272, (510, 578): 248336, (537, 753): 279277, (221, 104): 62621, (258, 18): 11058, (576, 25): 15576, (207, 53): 32007, (500, 33): 20300, (562, 100): 60562, (177, 194): 115582, (486, 84): 50886, (126, 191): 114026, (456, 391): 199558, (534, 134): 80934, (511, 483): 228225, (573, 356): 184890, (442, 230): 132406, (82, 193): 114989, (559, 305): 164220, (121, 285): 155766, (174, 273): 150809, (68, 380): 194393, (529, 774): 282614, (414, 256): 143667, (107, 286): 156166, (144, 292): 158679, (453, 294): 159619, (515, 311): 166622, (516, 588): 250285, (42, 714): 272631, (439, 247): 139820, (584, 621): 256473, (79, 156): 93679, (372, 138): 83172, (10, 437): 216561, (51, 758): 280032, (49, 153): 91849, (395, 117): 70595, (328, 80): 48328, (21, 19): 11421, (314, 15): 9314, (7, 32): 19207, (300, 46): 27900, (46, 702): 270604, (233, 85): 51233, (548, 519): 236368, (219, 134): 80619, (2, 672): 265362, (521, 656): 262663, (498, 371): 190913, (560, 250): 141237, (538, 560): 244786, (484, 290): 158007, (546, 293): 159302, (124, 281): 154105, (585, 281): 154383, (200, 249): 140613, (110, 348): 181397, (440, 328): 173455, (495, 418): 210849, (557, 227): 131198, (426, 359): 185954, (172, 135): 81172, (465, 139): 83865, (543, 400): 203697, (105, 188): 112466, (158, 182): 109302, (52, 477): 226722, (513, 69): 41913, (91, 113): 67891, (437, 101): 61037, (77, 62): 37277, (370, 8): 5170, (423, 22): 13623, (63, 255): 143060, (356, 75): 45356}

    Ce dico est constitué de plus de 200000 données (ce sont pour les clés : les coordonnées x er y d'une image, et pour les valeurs l'id de ces coordonnées) ; je voudrais obtenir par un dico.keys() une liste, mais dans l'ordre (que ce soit les valeurs de x, que les valeurs de y et les id) . Un dico.keys().sort() ne met dans l'ordre que les x sans tenir compte des y, ni des id) .

    Voilà par exemple ce que je voudrais obtenir :

    >> dico.keys()
    >> [... , (521, 798), (522, 798), (523, 798), (524, 798), (525, 798), (526, 798), (527, 798), (528, 798), (529, 798), (530, 798), (531, 798), (532, 798), (533, 798), (534, 798), (535, 798), (536, 798), (537, 798), (538, 798), (539, 798), (540, 798), (541, 798), (542, 798), (543, 798), (544, 798), (545, 798), (546, 798), (547, 798), (548, 798), (549, 798), (550, 798), (551, 798), (552, 798), (553, 798), (554, 798), (555, 798), (556, 798), (557, 798), (558, 798), (559, 798), (560, 798), (561, 798), (562, 798), ...]

    Comment faire ? (A l'aide !!!) . Je voudrais savoir (et pour ce que je veux faire) si vous pensez qu'au niveau du temps d'éxécution (et dans ce cas bien précis) si je dois rester dans l'optique de l'utilisation d'un dictionnaire ? .

    J'espère que vous allez pouvoir m'aider .

    a+

  2. #2
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par pyprog
    Comment faire ? (A l'aide !!!) . Je voudrais savoir (et pour ce que je veux faire) si vous pensez qu'au niveau du temps d'éxécution (et dans ce cas bien précis) si je dois rester dans l'optique de l'utilisation d'un dictionnaire ? .

    J'espère que vous allez pouvoir m'aider .

    a+
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    keyClasses = dico.keys()
    keyClasses.sort()
    print keyClasses
    Ca fonctionne très bien pour moi (ça classe l'ensemble des clés par ordre (x,y), ordre lexicographique normal).

    Après que ça prenne pas en compte les values, ça me parait normal (puisque tu classes les clés).

    Dictionnaire ou non, tout dépends de ce que tu vas faire de tes ids, si tu vas y acceder, comment, pourquoi, etc.....

  3. #3
    Membre averti
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Par défaut
    Citation Envoyé par denisC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    keyClasses = dico.keys()
    keyClasses.sort()
    print keyClasses
    Ca fonctionne très bien pour moi (ça classe l'ensemble des clés par ordre (x,y), ordre lexicographique normal).

    Après que ça prenne pas en compte les values, ça me parait normal (puisque tu classes les clés).

    Dictionnaire ou non, tout dépends de ce que tu vas faire de tes ids, si tu vas y acceder, comment, pourquoi, etc.....
    Là je ne suis pas d'accord, car si je fais un essai avec ton exemple (en tous cas merci quand même pour ta réponse) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> dicodico={(158, 182): 109302, (52, 477): 226722, (513, 69): 41913, (437, 101): 61037, (77, 62): 37277, (370, 8): 5170, (63, 255): 143060, (356, 75): 45356}
    >>> o = dicodico.keys()
    >>> o.sort()
    >>>print o 
    J'obtiens : [(52, 477), (63, 255), (77, 62), (158, 182), (356, 75), (370, 8), (437, 101), (513, 69)] et moi je veux obtenir : [(370, 8), (77, 62), (513, 69), (356, 75), (437, 101), (158, 182), (63, 255), (52, 477)]
    Voilà une solution qui m'a été donnée (qui fonctionne bien, mais qui malheureusement prend autant de temps que dans un traitement par une liste) sur une liste de diffusion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> dicoCO={(158, 182): 109302, (52, 477): 226722, (513, 69): 41913, (437, 101): 61037, (77, 62): 37277, (370, 8): 5170, (63, 255): 143060, (356, 75): 45356}
    >>> ordre1 = dicoCO.keys()
    >>> ordre1.sort(key=lambda x:x[1])
    >>> ordre1
    [(370, 8), (77, 62), (513, 69), (356, 75), (437, 101), (158, 182), (63, 255), (52, 477)]
    Si on vérifie avec l'ordre des id, c'est bon .

    ... Pas si évident de travailler avec les dictionnaires (en tous cas pour moi) .

    a+

  4. #4
    Expert confirmé

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Par défaut
    Citation Envoyé par pyprog
    ... Pas si évident de travailler avec les dictionnaires (en tous cas pour moi) .

    a+
    Avait pas compris que tu voulais classer par y puis par x.... (quelle idée )

    Tu peux essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    dicodico={(158, 182): 109302, (52, 477): 226722, (513, 69): 41913, (437, 101): 61037, (77, 62): 37277, (370, 8): 5170, (63, 255): 143060, (356, 75): 45356}
     
    o = dicodico.keys()
     
    def sort_y_x((x1,y1),(x2,y2)):
        if (y1,x1)<(y2,x2) :
            return -1
        else :
            return 1
     
    o.sort(sort_y_x)
    (ça marche chez moi). Après, pour la vitesse, je peux pas te dire, il faut tester sur ton jeu réel....

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    utiliser la méthode sort() en lui passant en paramètre une fonction chargée de la comparaison fait chuter fortement ses performances (ça s'aggrave avec un lambda); il vaut mieux passer par la méthode de coloration/décoloration qui consiste à trier une liste remaniée afin de permettre un tri standard, puis de rétablir la liste triée dans sa forme souhaitée en passant par des listes en intension. Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # -*- coding: latin1 -*-
    dicoCO={(158, 182): 109302, (52, 477): 226722, (513, 69): 41913, (437, 101): 61037, (77, 62): 37277, (370, 8): 5170, (63, 255): 143060, (356, 75): 45356}
    L1 = [(v[1], v[0]) for v in dicoCO.keys()] # on colore...
    L1.sort() # on trie sur la liste remaniée en utilisant la méthode standard...
    L2 = [(z[1], z[0]) for z in L1] # on décolore...
    print L2
    Les gains de performances devraient être significatifs...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

Discussions similaires

  1. [C#] [EXCEL] Travailler avec EXCEL sans ouvrir le logiciel
    Par Fabsou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/07/2004, 10h29
  2. Travailler avec PHP / Apache / MySQL
    Par R3iTt0R dans le forum Linux
    Réponses: 22
    Dernier message: 24/06/2004, 11h03
  3. Ouvrir le poste de travail (avec ShellExecute) ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/08/2003, 11h09
  4. Documentation sur la manière de travailler avec le XML en java
    Par DelPiero62 dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 26/03/2003, 09h16
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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