Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2775 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  init d'un dict à partir d'une chaîne de caractère [résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

init d'un dict à partir d'une chaîne de caractère [résolu]

n°1222474
suizokukan
Posté le 13-10-2005 à 20:29:56  profilanswer
 

Bonsoir, j'aimerais savoir s'il existe un module permettant, à partir d'une chaîne comme :
 

espace_de_loc =r"""monde
Europe
    France
    Italie
Asie
"""


de récupérer le tuple/la liste ayant la structure suivante :

res =\
( "monde",
 
   ( "Europe",
      (
          "France",
          "Italie"
      )
   ),
 
   ( "Asie"
   )
 
)

Je pourrais arriver à ce résultat en utilisant le XML mais j'aimerais savoir s'il existe une solution un peu moins lourde


Message édité par suizokukan le 15-10-2005 à 17:56:39

---------------
rule #1 : trust the python
mood
Publicité
Posté le 13-10-2005 à 20:29:56  profilanswer
 

n°1222476
masklinn
í dag viðrar vel til loftárása
Posté le 13-10-2005 à 20:31:38  profilanswer
 

je pense pas, mais je trouve pas ça très logique de générer un tuple, il le serait plus de générer un dict [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1222483
suizokukan
Posté le 13-10-2005 à 20:37:38  profilanswer
 

> Masklinn, tant pis.
 
> Pour ta suggestion de récupérer un dict, merci : ça peut être une bonne idée. L'essentiel est que je puisse facilement dire si "Italie" est un sous-ensemble de "Europe"... je cherche aussi un module permettant de faire ce genre de recherche dans des arbres.
 
Voilà le résultat avec un dict :

res = {
        "monde" : {
                    "Europe": {
                                "France" : {},
                                "Italie" : {}
                              },
                    "Asie"                    
                  }
      }

Message cité 1 fois
Message édité par suizokukan le 13-10-2005 à 20:38:06

---------------
rule #1 : trust the python
n°1222493
masklinn
í dag viðrar vel til loftárása
Posté le 13-10-2005 à 20:51:02  profilanswer
 

suizokukan a écrit :

Voilà le résultat avec un dict :

res = {
        "monde" : {
                    "Europe": {
                                "France" : {},
                                "Italie" : {}
                              },
                    "Asie"                    
                  }
      }



Je trouve ça plus logique :jap:
 
Et comme je l'ai déjà dit, je ne connais pas de module et je doute qu'il en existe un.
 
Au mieux, il y aura peut être un snippet dans le Cookbook imo


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1223090
Taz
bisounours-codeur
Posté le 14-10-2005 à 13:31:29  profilanswer
 

je crois que là t'es obligé de coder à la main. avec une petite pile, ça va marcher tout seul.

n°1223789
suizokukan
Posté le 15-10-2005 à 17:49:01  profilanswer
 

> Masklinn, Taz : merci de m'avoir répondu.
 
Voici le code que je propose. Je suis ouvert à toute suggestion pour l'améliorer.
 

#! /usr/bin/env python
# -*- coding: utf-8 -*-
################################################################################
# objet monarbre
################################################################################
 
class MonArbre(dict):
    """
        Dictionnaire créé à partir d'une chaîne décrivant sont contenu.
    """
 
    def __init__(self, src, v_tab=4):
        """
            Exemple de chaîne et du résultat attendu :
            --------------------
            monde
                Europe
                    France
                        Paris
                        Bordeaux
                    Allemagne
                Asie
 
            --------------------
            self = {
                        monde = {
                                    {
                                        Europe ={
                                                    France= {
                                                                Paris = {},
                                                                Bordeaux = {}
                                                            },
                                                    Allemagne=  {
                                                                }
                                                             
                                                },
                                        Asie = {}
                                    }
                                }
                   }
            --------------------
             
             
            [Normalement, une tabulation vaut 4 espaces mais le paramètre
             v_tab permet de changer cela]
             Les espaces en fin de ligne seront ignorés.
        """
 
        lignes = src.splitlines()
        h = [self]  # références de la hiérarchie.
        n = 0       # niveau dans la hiérarchie.
         
        for l in lignes:
 
            l = l.rstrip()  # on ne tient pas compte des espaces à droite.
             
            #   on ne tient pas compte des lignes vides et seulement formés
            # d'espaces :
            if l!="" and l.isspace()==False:
 
                # mot à ajouter :
                mot = l.split()[0]                
                # niveau hiérarchique du mot à ajouter :
                n_actuel = (len(l)-len(l.lstrip()))/v_tab
 
                if n_actuel < n:                    
                    # suppression des références devenues inutiles :
                    for i in range(n_actuel, n):
                        h.pop()
 
                    n = n_actuel                        
 
                    # ajout de cette entrée :
                    h[n-1][mot] = {}
 
                    # ajout de la référence courante à <h> :
                    h.append( h[n-1][mot] )
                     
                elif n_actuel == n:                    
                    # ajout de cette entrée :
                    h[n-1][mot] = {}
 
                    # ajout de la référence courante à <h> :
                    h.pop() # suppression de la dernière référence de même niveau.
                    h.append( h[n-1][mot] )
                     
                elif n_actuel == n+1:
                    n = n_actuel
                    # ajout de cette entrée :
                    h[n-1][mot] = {}
 
                    # ajout de la référence courante à <h> :
                    h.append( h[n-1][mot] )
 
                elif n_actuel > n+1 :
                    # erreur : on ne peut descendre dans la hiérarchie que niveau
                    # après niveau.
                    pass
                 
 
         
src =\\
    """
    monde
        Europe
            France
                Paris
                Bordeaux
            Allemagne
        Asie
    """
     
print MonArbre(src)


 
edit : problème de l'anti-slash


Message édité par suizokukan le 15-10-2005 à 17:50:47

---------------
rule #1 : trust the python

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  init d'un dict à partir d'une chaîne de caractère [résolu]

 

Sujets relatifs
[Résolu]Génération aléatoire puis insertion[RESOLU][Access/VBA] Selectionner onglet access ?
[RESOLU][Access / SQL] Erreur OVERFLOW lors de l'update de ma BDD ![resolu] Petit souci sur le php de mon formulaire
Zoomer une image puis la dézoomer [résolu][resolu] Centrer une image vertical dans une <div> ??
IP de connexion internet [Résolu][résolu] IE 5.5 problème avec une ancre "top" dans le body
[RESOLU][SQL/Access]Impossibilité de modifier le contenu de mes tables[RESOLU] Petit probleme debutant sur constructeur
Plus de sujets relatifs à : init d'un dict à partir d'une chaîne de caractère [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR