字典键中的通配符

时间:2018-10-05 00:16:42

标签: python python-3.x dictionary wildcard glob

假设我有一本字典:

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 :(得分:4)

您可以使用fnmatch.fnmatch来匹配Unix shell样式的通配符:

>>> 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)。对于大型词典,这可能会成为一个问题。仅当查询性能不成问题时才建议使用。

答案 1 :(得分:4)

我会将您的单个字典拆分为两个,常规字典和通配符衍生的字典,这样您就可以保持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