Подстановочный знак в словарном ключе - PullRequest
0 голосов
/ 05 октября 2018

Предположим, у меня есть словарь:

rank_dict = {'V*': 1, 'A*': 2, 'V': 3,'A': 4}

Как вы можете видеть, я добавил * в конец одного V. В то время как 3 может быть значением только для V, я хочу другой ключдля V1, V2, V2234432 и т. д. Я хочу проверить это по:

checker = 'V30'

и получить значение.Какой правильный синтаксис для этого?

for k, v in rank_dict.items():
    if checker == k:
        print(v)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я бы разделил ваш единственный словарь на два, обычный и полученный из подстановочных знаков, чтобы вы могли поддерживать O (1) сложность времени поиска.

rank_dict = {'V*': 1, 'A*': 2, 'V': 3,'A': 4}

d1 = {k: v for k, v in rank_dict.items() if not k.endswith('*')}
d2 = {k[0]: v for k, v in rank_dict.items() if k.endswith('*')}

def get_val(key, d1, d2):
    return d1.get(key, d2.get(key[0]))

get_val('V', d1, d2)    # 3
get_val('V30', d1, d2)  # 1
0 голосов
/ 05 октября 2018

Вы можете использовать fnmatch.fnmatch для сопоставления с подстановочными знаками в стиле оболочки Unix:

>>> import fnmatch
>>> fnmatch.fnmatch('V34', 'V*')
True

>>> rank_dict = {'V*': 1, 'A*': 2, 'V': 3,'A': 4}
>>> checker = 'V30'
>>> for k, v in rank_dict.items():
...     if fnmatch.fnmatch(checker, k):
...         print(v)
... 
1

ПРИМЕЧАНИЕ. Каждый поиск будет иметь O (n) сложность по времени.,Это может стать проблемой с большими словарями.Рекомендуется, только если производительность поиска не является проблемой.

...