字典键中的通配符
Wildcard in dictionary key
假设我有一本字典:
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)
您可以使用 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)。这可能成为大型词典的问题。仅当查找性能不是问题时才推荐使用。
我会将您的单个字典拆分为两个,一个常规字典和一个通配符派生的字典,这样您就可以保持 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
假设我有一本字典:
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)
您可以使用 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)。这可能成为大型词典的问题。仅当查找性能不是问题时才推荐使用。
我会将您的单个字典拆分为两个,一个常规字典和一个通配符派生的字典,这样您就可以保持 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