Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2090 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]


---------------
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 by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
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


---------------
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 by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
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-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)