2010-08-09 4 views
5

J'ai un dictionnaire en Python où les clés sont des chemins d'accès. Par exemple:Impression d'un sous-ensemble particulier de clés dans un dictionnaire

dict["/A"] = 0 
dict["/A/B"] = 1 
dict["/A/C"] = 1 

dict["/X"] = 10 
dict["/X/Y"] = 11 

Je me demandais, ce qui est un bon moyen d'imprimer tous les "sous-chemins" donné n'importe quelle clé.

Par exemple, étant donné une fonction appelée "print_dict_path" qui fait cela, quelque chose comme

print_dict_path("/A") 

ou

print_dict_path("/A/B") 

imprimerait quelque chose comme:

"B" = 1 
"C" = 1 

La seule méthode que je peux penser est quelque chose comme l'utilisation de regex et de passer par le dictionnaire entier, mais je suis n Bien sûr, si c'est la meilleure méthode (et je ne suis pas très versé dans regex).

Merci pour toute aide.

Répondre

5

Une possibilité sans utiliser regex est d'utiliser simplement startswith

top_path = '/A/B' 
for p in d.iterkeys(): 
    if p.startswith(top_path): 
     print d[p] 
1

Vous pouvez utiliser str.find:

def print_dict_path(prefix, d): 
    for k in d: 
     if k.find(prefix) == 0: 
      print "\"{0}\" = {1}".format(k,d[k]) 
1

Eh bien, vous aurez certainement une boucle à travers l'ensemble dict.

def filter_dict_path(d, sub): 
    for key, val in d.iteritems(): 
     if key.startswith(sub): ## or do you want `sub in key` ? 
      yield key, val 

print dict(filter_dict_path(old_dict, sub)) 

Vous pouvez accélérer cela en utilisant la structure de données appropriée: un arbre.

1

La structure de votre dictionnaire est-elle corrigée? Il serait plus agréable de le faire en utilisant des dictionnaires imbriqués:

{ 
    "A": { 
     "value": 0 
     "dirs": { 
      "B": { 
       "value": 1 
      } 
      "C": { 
       "value": 1 
      } 
     } 
    "X": { 
     "value": 10 
     "dirs": { 
      "Y": { 
       "value": 11 
      } 
} 

La structure de données sous-jacente est ici un arbre, mais Python n'a pas construit en

+0

Vous aimeriez voir mon message http://stackoverflow.com/questions/3350413/-there-a-faster-way-to-get-subtrees-from-tree-like-structures-in-python-than- th/3350642 # 3350642 si vous pensez à la structure de l'arbre. –

1

Cela supprime un niveau de indenter, qui peut. rendre le code dans le corps de la boucle plus lisible dans certains cas

top_path = '/A/B' 
for p in (p for p in d.iterkeys() if p.startswith(top_path)): 
    print d[p] 

Si vous trouvez la performance d'être un problème, pensez à utiliser un trie au lieu du dictionnaire

Questions connexes