2010-08-09 19 views
5

Mam słownik w języku Python, w którym klucze są ścieżkami. Na przykład:Drukowanie określonego podzbioru kluczy w słowniku

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

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

Zastanawiałem się, co jest dobrym sposobem, aby wydrukować wszystkie „podścieżki” biorąc pod dowolny klawisz.

Na przykład, biorąc pod uwagę funkcję o nazwie "print_dict_path", który robi to, coś

print_dict_path("/A") 

lub

print_dict_path("/A/B") 

by wydrukować coś takiego:

"B" = 1 
"C" = 1 

Jedynym Metoda, którą mogę wymyślić, to coś w rodzaju korzystania z regex i przeglądania całego słownika, ale jestem n Jestem pewien, że to jest najlepsza metoda (ani ja nie jestem dobrze zorientowany w regex).

Dzięki za pomoc.

Odpowiedz

5

Jedną z możliwości bez użycia regex jest po prostu użyć startswith

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

Można użyć 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

Cóż, na pewno będziesz mieć do pętli przez cały 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)) 

Można przyspieszyć to za pomocą odpowiedniej struktury danych: drzewa.

1

Czy twoja struktura słownika została naprawiona? Byłoby ładniej to zrobić przy użyciu zagnieżdżonych słowniki:

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

Podstawową strukturą danych o to drzewo, ale Python nie posiada, że ​​zbudowany w

+0

Możesz zobaczyć mój post http://stackoverflow.com/questions/3350413/is-there-a-faster-way-to-get-subtrees-from-tree-like-structures-in-python-than- th/3350642 # 3350642 jeśli myślisz o strukturze drzewa. –

1

Usuwa jeden poziom wcięcia, które mogą. uczynić kod w ciele pętli for bardziej czytelny w niektórych przypadkach

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

Jeśli okaże osiągi być problemem, należy rozważyć użycie trie zamiast słownika

Powiązane problemy