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 :

Récupérer l'indice d'un élément présent dans des listes imbriquées


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2021
    Messages : 2
    Par défaut Récupérer l'indice d'un élément présent dans des listes imbriquées
    Bonjour à tous,

    je suis en train de réaliser un petit programme pour un projet informatique en prépa, nous travaillons sur la compression d'image et je programme la partie sur la compression de Huffmann. Cette compression réside sur la réalisation d'un arbre avec les différents caractères, chaque chemin correspondant à un caractère (branche de gauche égale à 0 et branche de droite égale à 1), ce qui permet de ressortir un codage pour chaque caractère, qui possède moins de bits qu'un octet classique.

    La manière la plus simple de modéliser cet arbre est je pense de créer une série de listes imbriquées, où l'indice d'un élément serait son code.

    Ma question est la suivante : existe-t-il une fonction dans le même esprit que "index" qui permettrait de récupérer l'indice complexe d'un élément dans une série de liste imbriquées ?
    par exemple :

    A=[[[' ', ['H', [['V', ['X', ['U', 'W']]], ['J', 'K']]]], ['C', 'Z']],[['A', 'B'],[['O', [['P', ['G', 'M']], [[['L', 'S'], ['E', 'F']], 'N']]], 'I']]]

    serait un arbre. La lettre 'O' a pour indice 1 1 0 0, lorsque je tape A[1][1][0][0] je récupère le 'O'. Je recherche une fonction permettant d'obtenir l'indice du 'O' directement.

    Merci par avance pour vos réponses ! :-)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par Enguerrand1 Voir le message
    Ma question est la suivante : existe-t-il une fonction dans le même esprit que "index" qui permettrait de récupérer l'indice complexe d'un élément dans une série de liste imbriquées ?
    Une telle fonction n'existe pas mais associer à chaque caractère son indice, c'est parcourir l'arbre pour fabriquer un dictionnaire réalisant cette association.

    Citation Envoyé par Enguerrand1 Voir le message
    La manière la plus simple de modéliser cet arbre est je pense de créer une série de listes imbriquées, où l'indice d'un élément serait son code.
    Ca devrait fonctionner mais avec Python un arbre binaire est déjà réalisé avec le module standard heapq (et vous avez des exemples d'utilisation de codage de huffman avec cette bibliothèque qui montrent que çà aide bien).

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

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Une manière de faire parmi d'autres :

    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
    def getpathofbinarytree(l, idx=()):
        if type(l) is list :
            n = len(l)
            if n==0 : return {}
            d = getpathofbinarytree(l[0], idx+(0,))
            if n>1 : d.update( getpathofbinarytree(l[1], idx+(1,) ) )
            return d
        else :
            return {idx:l}
     
    pathtree = getpathofbinarytree(A)
    paths = list(pathtree.keys())
    treeval = list(pathtree.values())
     
    #### Pour vous rendre compte un peu de ce qu'il y a la dedans
    for k,v in pathtree.items(): print(k,v)
     
    #### Pour rechercher une lettre
    print( paths[ treeval.index('O') ] )

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lg_53 Voir le message
    if type(l) is list
    Tu ne voudrais pas que ta fonction puisse aussi gérer un tuple ?
    Même sans ça, le danger de cette méthode, c'est que si "l" est un truc qui hérite de list, ça ne marche plus
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class xxx(list): pass
     
    A=[[[' ', ['H', [['V', ['X', ['U', 'W']]], ['J', 'K']]]], ['C', 'Z']],[['A', 'B'],[['O', [['P', ['G', 'M']], [[['L', 'S'], ['E', 'F']], 'N']]], 'I']]]
    pathtree1 = getpathofbinarytree(A)           # HADOPI
    A=xxx(A)
    pathtree2 = getpathofbinarytree(A)           # HAPUDOPI

    Solution: isinstance() => if isinstance(l, list). La fonction reconnaitra une liste dans "l" même s'il n'en est que son arrière petit-fils. Et (avantage) ça permet de tester plusieurs possibilités => if isinstance(l, (tuple, list)).

    Sinon j'ai bien aimé ta fonction
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2021
    Messages : 2
    Par défaut
    Bonjour,

    merci pour vos réponses ! J'aime bien la fonction utilisant un dictionnaire, je vais creuser de mon côté pour vraiment comprendre comment marche un dictionnaire, je suis plutôt débutant en python et je ne maitrise pas encore cette notion, et ensuite comprendre le fond de la fonction.

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Solution: isinstance() => if isinstance(l, list). La fonction reconnaitra une liste dans "l" même s'il n'en est que son arrière petit-fils. Et (avantage) ça permet de tester plusieurs possibilités => if isinstance(l, (tuple, list)).
    Ouaip, j'avais déjà passé pas mal de temps à faire la fonction, et puis j'avais une réunion qui m'attendait, alors j'ai posté ce que j'avais et qui fonctionnait sans changer ça. Et comme notre ami nous as dit une liste, je suis resté sur la liste. Parce que au sens large, on pourrait vouloir considérer tout type d'itérable, et donc tester un truc du style isinstance(l, collections.Iterable), mais pas sûr de la syntaxe exact, à vérifier.

    Citation Envoyé par Enguerrand1
    J'aime bien la fonction utilisant un dictionnaire, je vais creuser de mon côté pour vraiment comprendre comment marche un dictionnaire, je suis plutôt débutant en python et je ne maitrise pas encore cette notion, et ensuite comprendre le fond de la fonction.
    Ce n'est guère compliqué. Quand on a une liste, on accède aux éléments via leur index. Quand on a des dico, on accède aux éléments via leur clé (un tag, un label). Et là la subtilité dans la solution que je propose (qui complique probablement la compréhension du code) c'est qu'en tag je n'ai pas mis juste une chaine de caractère comme on le fait bien souvent, j'ai mis un tuple. Ce qui donne donc plus de sens à la clé, car elle va donc contenir le chemin dans ton arbre pour accéder à l'élément.

Discussions similaires

  1. Python : Modifier une valeur dans des listes imbriquées
    Par nonotiptop dans le forum Général Python
    Réponses: 5
    Dernier message: 07/01/2017, 21h05
  2. Réponses: 8
    Dernier message: 16/06/2014, 16h12
  3. Récupérer l'indice d'une valeur choisie dans une liste déroulante
    Par winflow dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/01/2014, 12h15
  4. [MySQL] Comment récupérer le nombre d'élément présent dans une table
    Par TrX314 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/04/2007, 21h20
  5. Présentation dans des listes imbriquées
    Par Ghusse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/09/2005, 09h35

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