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 :

Extraire la clé d'un dictionnaire pour une valeur donnée


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Employé
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Employé
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Par défaut Extraire la clé d'un dictionnaire pour une valeur donnée
    Bonjour,

    Pour ce petit problème, j'aimerais que lorsque je donne une valeur présente dans le dico, celui-ci me renvoie sa clef.
    J'ai cherché dans les docs Python et il semblerait que le faire directement ne soit pas possible.
    Je vous questionne donc pour savoir s'il y aurait finalement un moyen, car de mon côté j'ai pensé à 2 possibilités :
    - comparer les valeurs de chaque clef une par une avec un 'for x in range', mais il suffit que je demande bcp de valeurs qui se trouvent à la fin et le nombre de tests à faire sera gigantesque.
    - créer localement un autre dico où les valeurs et les clefs y seront inversées. Je n'ai pas encore réfléchi à la méthode exacte pour le faire, mais dans tous les cas les caractères que j'ai établis comme valeurs sont répartis par catégorie dans 6 dicos différents, ce qui alourdirait considérablement le programme.

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    si votre dictionnaire est figé/constant et que les valeurs sont uniques alors vous pouvez recréer un dictionnaire inversé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    d = {
        'A': 1,
        'B': 2,
        'C': 3,
    }
     
    d_inv = {v: k for k, v in d.items()}
    d_inv[1] donnera 'A'

    Par contre si le premier dictionnaire évolue il faudra recharger son dictionnaire inversé, ce qui prendra du temps.


    Autre solution est d'extraire tous les éléments en fonction de la valeur recherchée, il peut y avoir plusieurs clés retournées du coup.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x = 1
    keys = [k for k, v in d.items() if v == x]
    # if len(keys) > 1: raise Exception("...") # Gestion d'erreur si nécessaire
    keys[0]
    keys[0] donnera 'A' dans mon exemple

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par YCL-1 Voir le message
    Autre solution est d'extraire tous les éléments en fonction de la valeur recherchée, il peut y avoir plusieurs clés retournées du coup.
    à l'inverse, si ce qui importe c'est de retrouver au moins un index qui correspond et s'affranchir du reste des clés à parcourir parce que ça prend du temps on pourra utiliser next() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = next(i for i in dico if dico[i] == valeur)

  4. #4
    Membre habitué
    Homme Profil pro
    Employé
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Employé
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Par défaut
    Bien, j'ai essayé la 2° méthode, mais je suis confronté à un problème.
    Je vais détailler le contexte pour que ce que je recherche soit bien compris :

    Un utilisateur saisit un texte.
    Le premier caractère de ce texte est relevé, et on regarde s'il est présent dans le dico.
    S'il l'est, on renvoie la clef de ce caractère qui est un entier, que l'on va rentrer dans la
    première case d'un tableau.

    etc etc ... Jusqu'à la fin du texte saisi.

    Question principale : Comment demander à retourner la clef du caractère
    sans avoir à passer par tous les précédents (for x in range(...)) ?
    Par exemple, je dis n'importe quoi, mais un truc dans le genre :
    if carac in DICO :
    return key(carac)


    Problème : lorsque le dico est défini dans le programme, les valeurs sont classées
    par ordre alphanumérique, et leurs clefs respectives en revanche ne sont pas
    systématiquement consécutives (on passe de 145 à 234 par exemple), mais toujours
    croissantes, de 12 à 12345. Or Python réarrange l'organisation en suivant une logique
    que je n'ai pas trouvée.

    Question supplémentaire : Y a-t-il un moyen pour que cette réorganisation
    ne se fasse pas ?


    Voilà, j'espère que cette problématique est solvable, sinon ça m'embêtait bien

    Merci d'avance pour votre aide, si vous avez besoin de détails supplémentaires (hormis les
    dictionnaires), je suis tout à vous.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Pour respecter l'ordre dans un dictionnaire :

    collections.OrderedDict

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from collections import OrderedDict # Container datatypes
     
    d = OrderedDict([
        ("A",     1,    ), 
        ("C",     2,    ), 
        ("B",     3,    ), 
    ])
    Toutes les méthodes d'un dictionnaire classique fonctionnent sur un OrderedDict, simplement l'ordre d'insertion est respecté.

    odict_keys(['A', 'C', 'B'])

    odict_keys(['A', 'C', 'B', 'c'])


    Pour votre question principale vous pouvez passer par la commande list.index pour retourner la position d'un élément, et gérer ainsi deux tableaux, keys et values.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    keys = ["a", "b", "c"]
    values = [56, 57, 58]
    keys.index("a") # 0
    values[keys.index("a")] # 56
    keys[values.index(56)] # 'a'
    Pour repasser en OrderedDict :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OrderedDict(zip(keys, values))
    Et le contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    keys, values = list(d.keys()), list(d.values())

  6. #6
    Membre habitué
    Homme Profil pro
    Employé
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Employé
    Secteur : Alimentation

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Par défaut
    D'accord, j'ai tout pigé et vérifié, ça marche nickel

    Merci

Discussions similaires

  1. Active la cellule pour une valeur donnée par inputbox
    Par Kestion100 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 02/06/2015, 09h59
  2. Réponses: 1
    Dernier message: 22/09/2006, 13h05
  3. Réponses: 2
    Dernier message: 07/09/2006, 17h05
  4. [CR] Générer des espaces pour une valeur champ
    Par newpress dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/02/2005, 17h43
  5. [CR] Filtrer pour une période donnée
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/04/2004, 16h32

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