2010-08-09 26 views
5

Tengo un diccionario en Python donde las claves son nombres de ruta. Por ejemplo:Imprimir un subconjunto particular de claves en un diccionario

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

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

Me preguntaba, ¿cuál es una buena manera de imprimir todos los "subpaths" dados cualquier tecla.

Por ejemplo, dada una función llamada "print_dict_path" que hace esto, algo así como

print_dict_path("/A") 

o

print_dict_path("/A/B") 

imprimiría algo como:

"B" = 1 
"C" = 1 

El único método que puedo pensar es algo así como usar regex y recorrer todo el diccionario, pero estoy n No estoy seguro de si ese es el mejor método (ni tampoco soy tan versado en expresiones regulares).

Gracias por cualquier ayuda.

Respuesta

5

Una posibilidad sin necesidad de utilizar expresiones regulares es que sólo tiene que utilizar startswith

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

Puede utilizar 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

Bueno, que sin duda tiene que recorrer todo el 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)) 

Puede acelerar esto utilizando la estructura de datos adecuada: un Árbol.

1

¿Se ha corregido la estructura de su diccionario? Que sería mejor hacer esto utilizando diccionarios anidados:

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

La estructura de datos subyacente aquí es un árbol, pero Python no tiene que construyeron en

+0

Te gustaría ver mi publicación http://stackoverflow.com/questions/3350413/is-there-a-faster-way-to-get-subtrees-from-tree-like-structures-in-python-than- th/3350642 # 3350642 si piensas en la estructura del árbol. –

1

Esto elimina un nivel de sangría, lo que puede. hacer que el código en el cuerpo del bucle más legible en algunos casos

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

Si encuentras el rendimiento a ser un problema, considere el uso de un trie en lugar del diccionario

Cuestiones relacionadas