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

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

Marsh Posté le 13-10-2005 à 20:29:56    

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
Reply

Marsh Posté le 13-10-2005 à 20:29:56   

Reply

Marsh Posté le 13-10-2005 à 20:31:38    

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]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 13-10-2005 à 20:37:38    

> 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
Reply

Marsh Posté le 13-10-2005 à 20:51:02    

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


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 14-10-2005 à 13:31:29    

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

Reply

Marsh Posté le 15-10-2005 à 17:49:01    

> 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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed