Подстановочный знак в словарном ключе
Предположим, что у меня есть словарь:
rank_dict = {'V*': 1, 'A*': 2, 'V': 3,'A': 4}
Как вы можете видеть, я добавил a * к концу одного V. В то время как a 3 может быть значением только для V, я хочу другой ключ для V1, V2, V2234432 и т. д...Я хочу проверить это против:
checker = 'V30'
И получить значение. каков правильный синтаксис для этого?
for k, v in rank_dict.items():
if checker == k:
print(v)
2 ответа:
Вы можете использовать
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) временную сложность. Это может стать проблемой для больших словарей. Рекомендуется только в том случае, если производительность поиска не является проблемой.
Я бы разделил ваш единственный словарь на два, обычный и производный от подстановочных знаков, чтобы вы могли поддерживать сложность времени поиска 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