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 :

Dictionnaire : Changer l'index/clé


Sujet :

Python

Vue hybride

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut Dictionnaire : Changer l'index/clé
    Bonjour,

    Tout d'abord je m'excuse si cette question est élémentaire, je débute en python et même si j'ai l'impression de progresser vite, je bute souvent sous des difficultés un peu débile
    (je viens du monde C )

    Je n'ai trouvé nul part comment on peut changer l'index (ou la clé) dans un dictionnaire...

    J'utilise le dictionnaire comme un tableau de pointeur où on peut affecter à chaque pointeur un label.

    Or, si je veux changer ce label, impossible...

    je suis obliger de créer une fonction qui insère le nouveau label et ensuite qui parcourt l'ancien label pour recopier les données.

    Je trouve cela super pénalisant, surtout si j'utilise le programme pour un dictionnaire à plusieurs milliers d'entrées...

    Je vous remercie !!

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonsoir,

    tu veux faire quelquechose comme ça ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    d = {}
    d[1] = "un"
    d[2] = "deux"
    d[10] = d[1]
    del d[1]
    la clé associée à "un" passe de 1 à 10 dans ce cas. ce n'est pas nécessaire de parcourir l'ensemble du dictionnaire sinon tu passes d'une méthode en O à une méthode en O(n)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    Hmm, je vais essayer.

    Vous avez bien ciblé le problème de calculabilité que je cherche à éviter.

    Par contre, si je n'ai pas fait ce que vous proposez, c'est parce qu'il me semblait que des affectations par copie comme cela n'avaient pour but que de recopier le pointeur et non les valeurs.
    Donc, si je modifie le premier, le deuxième nouvellement créé pointant vers le même, va forcément être détruit également non ?

    Où est mon erreur ?

    Merci bien, je visualise (avec ce système, je vais faire des tests) comment optimiser mon code (en fait, j'ai un dictionnaire de dictionnaire)

    merci !!

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    la fonction id() permet de connaitre l'adresse mémoire (après une conversion en hexa).

    dans l'exemple que je te donne id(d[1] avant changement) = id(d[10 après changement) il n'y a pas de "recopie" de la valeur, c'est la même et au même emplacement mémoire.

    python utilise un compteur de référence. la chaine "un" est référencée 1 fois par d[1].

    dès que je fais d[10] = d[1], la chaine "un" est référencée 2 fois, une fois par d[1] et une fois par d[10].

    dès que je fais del d[1] elle n'est plus référencée que par d[10] donc la chaine ne part pas au ramasse miettes, pas de soucis.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Par défaut
    dès que je fais del d[1] elle n'est plus référencée que par d[10] donc la chaine ne part pas au ramasse miettes, pas de soucis.
    Rho, génial !!

    je pensais pas que ca avait été prévu

    merci mille fois !!

    (et merci pour l'info du id(), je vais pouvoir m'en servir)

  6. #6
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour,

    Tu parle souvent de pointeur est c'est une bonne façon de penser ceci dit il y a parfois des subtilités.
    En Python, on distingue les types immuables et les non-immuables. 1 étant un entier il est immuable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> a = 1
    >>> id( a )
    23447032
    >>> a += 1
    >>> id(a)
    23447008
    >>>
    Python ne modifie jamais un entier ou un string, il en recrée un

    Les listes par exemple sont non-immuables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> b = [1]
    >>> id( b )
    140205508242392
    >>> b += [2]
    >>> id( b )
    140205508242392
    >>>
    Un petit exemple surprenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> a = 1
    >>> b = 1
    >>> id( a )
    23447032
    >>> id( b )
    23447032
    >>>
    Python ne prend pas la peine de recréer un objet car de toute façon si a ou b est modifié il sera en réalité recréé.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CHANGER UN INDEX DE TABLESPACE
    Par gallargues dans le forum Administration
    Réponses: 2
    Dernier message: 09/04/2010, 10h45
  2. evenement changer d'index
    Par zandru dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 02/07/2008, 16h12
  3. Changer les index de controles insérés dynamiquement
    Par BM42 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/10/2007, 14h49
  4. Dictionnaire de type index
    Par mmooaa dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 21/05/2007, 21h35
  5. changer le index.htm
    Par pharaonline dans le forum Apache
    Réponses: 2
    Dernier message: 16/06/2006, 20h13

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