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 des clef parents à partir d'un chemin cible dans un dictionnaire


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Intérimaire
    Inscrit en
    Mai 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Intérimaire

    Informations forums :
    Inscription : Mai 2017
    Messages : 99
    Par défaut Extraire des clef parents à partir d'un chemin cible dans un dictionnaire
    Bonjour,

    Je bloque sur une méthode pour récupérer une clef parent à partir d'un chemin cible dans un dictionnaire.

    Explication:

    voici mon dictionnaire de test:
    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
     
    dico_test={
        "table1":{
            "listetraitements":{
                "job1":{
                    "nodeid":"riri"
                },
                "job2":{
                    "nodeid":"toto"
                },
                "job3":{
                    "nodeid":"riri"
                }
            }
        },
        "table2":{
           "listetraitements":{
                "job1":{
                    "nodeid":"riri"
                },
                "job2":{
                    "nodeid":"toto"
                },
                "job3":{
                    "nodeid":"tata"
                }
            }
        }
    }
    et je souhaite récupérer tous les jobs de la table1 qui ont un nodeid égal à "riri" dans array.

    pour cela j'ai fait un array "cible" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    path=['table1','listetraitements','job.*','nodeid']
    j'ai commencé par faire une fonction récursive qui en fonction de mon path va parcourir le dico :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def GetKey(liste,dico,*args):
        value=args[0]
        if len(liste) == 0 :
            return dico
        else:
            for key in dico.keys():
                if re.match(liste[0],key):
                    if dico[key] == value:
                        print(key)
                    else:
                        dico[key]=GetKey(liste[1:],dico[key],value)
    Alors ca fonctionne car je vois dans la console ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ##CODE
    res=GetKey(path,dico_test,'riri')
    print(res)
     
    #Console
    nodeid
    nodeid
    mais je voudrais avoir les clef parents des nodeid càd "job1" et "job3"

    J'avoue que je suis à court d'idée :/

    Je vous remercie par avance pour votre aide

    Cordialement

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par Bensljul Voir le message
    mais je voudrais avoir les clef parents des nodeid càd "job1" et "job3"
    Pour avoir les clefs des parents, soit vous les passez comme variable/liste à l'appel de la fonction récursive, soit vous utilisez des "class" pour avoir un lien sur le "parent" qui permettra de le récupérer.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre très actif
    Homme Profil pro
    Intérimaire
    Inscrit en
    Mai 2017
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Intérimaire

    Informations forums :
    Inscription : Mai 2017
    Messages : 99
    Par défaut
    Merci beaucoup ^^

    j'avance un peu grâce à votre message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def GetKey(liste,dico,*args):
        value=args[0]
        if len(liste) == 0 :
            return dico
        else:
            for key in dico.keys():
                if re.match(liste[0],key):
                    if dico[key] == value:
                        print(args[1])
                    else:
                        dico[key]=GetKey(liste[1:],dico[key],value,key)
    le print prends bien les jobs correspondant, mais j'arrive pas à les récupérer XD

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Un truc "simple" qui répond peut-être à ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [{table : {job : dico_test[table]['listetraitements'][job]['nodeid']}} for table in dico_test for job in dico_test['table1']['listetraitements'] if dico_test[table]['listetraitements'][job]['nodeid'] == 'riri']
    [{'table1': {'job1': 'riri'}}, {'table1': {'job3': 'riri'}}, {'table2': {'job1': 'riri'}}]]
    Dernière modification par Invité ; 09/12/2021 à 16h30.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Une autre solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def get_path(d, value, keys=None):
        keys = keys or []
        for k, v in d.items():
            if isinstance(v, dict):
                yield from get_path(v, value, keys=keys+[k])
            elif v == value:
                yield '/'.join(keys + [v])
     
    for e in get_path(dico_test, 'riri'):
        print (e)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 213
    Par défaut
    hello,
    voici une fonction qui trace les chemins jusqu'à la valeur cherchée et qui pourrait servir dans le cas présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def getpath(nested_dict, value, prepath=()):
        p = []
        for k, v in nested_dict.items():
            path = prepath + (k,)
            if v == value: # found value
                p.append(path)
            elif hasattr(v, 'items'): # v is a dict
                p += getpath(v, value, path) # recursive call
        return p
    ce qui donne pour le cas présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(getpath(dico_test, 'riri'))
    [('table1', 'listetraitements', 'job1', 'nodeid'),
    ('table1', 'listetraitements', 'job3', 'nodeid'),
    ('table2', 'listetraitements', 'job1', 'nodeid')]
    Ami calmant, J.P

  7. #7
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    je déborde un peu du contexte et de l'utilisation de dictionnaires imbriqués.

    Avec des données organisées en une arborescence XML simple, le package xml plus l'utilisation de XPath, on arrive assez facilement au but recherché.

Discussions similaires

  1. Extraire des emails a partir d'un PDF
    Par cyril11 dans le forum Windows
    Réponses: 1
    Dernier message: 12/09/2017, 16h23
  2. Extraire des données a partir d'une colonne d'un qvd
    Par mano_bi dans le forum QlikView
    Réponses: 5
    Dernier message: 21/07/2015, 21h35
  3. Réponses: 1
    Dernier message: 28/03/2010, 10h06
  4. Réponses: 1
    Dernier message: 15/12/2008, 19h50

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