Печать определенного набора ключей в словаре - PullRequest
5 голосов
/ 09 августа 2010

У меня есть словарь в Python, где ключи являются путями.Например:

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

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

Мне было интересно, как можно распечатать все «подпути» для любой клавиши.

Например, для функции «print_dict_path», которая делает это,что-то вроде

print_dict_path("/A")

или

print_dict_path("/A/B")

напечатало бы что-то вроде:

"B" = 1
"C" = 1

Единственный метод, который я могу придумать, это что-то вроде использования регулярных выражений ичерез весь словарь, но я не уверен, что это лучший метод (и я не очень хорошо разбираюсь в регулярных выражениях).

Спасибо за любую помощь.

Ответы [ 5 ]

5 голосов
/ 09 августа 2010

Одна из возможностей без использования регулярных выражений - просто использовать startswith

top_path = '/A/B'
for p in d.iterkeys():
    if p.startswith(top_path):
        print d[p]
1 голос
/ 10 августа 2010

Это удаляет один уровень отступа, что может сделать код в теле цикла for более читабельным в некоторых случаях

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

Если вы считаете, что производительность является проблемой, рассмотрите возможность использования trie вместо словаря

1 голос
/ 09 августа 2010

Исправлена ​​ли структура вашего словаря?Было бы лучше сделать это, используя вложенные словари:

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

Базовая структура данных здесь - дерево, но в Python его нет.

1 голос
/ 09 августа 2010

Ну, вам определенно придется пройти через весь диктовку.

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

Вы можете ускорить это, используя соответствующую структуру данных: дерево.

1 голос
/ 09 августа 2010

Вы можете использовать str.find:

def print_dict_path(prefix, d):
    for k in d:
        if k.find(prefix) == 0:
            print "\"{0}\" = {1}".format(k,d[k])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...