代码之家  ›  专栏  ›  技术社区  ›  gwydion93

字典键中的通配符

  •  3
  • gwydion93  · 技术社区  · 7 年前

    假设我有一本字典:

    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 回复  |  直到 7 年前
        1
  •  6
  •   falsetru    7 年前

    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)时间复杂度。这可能成为大型词典的一个问题。仅当查找性能不是问题时才建议使用。

        2
  •  4
  •   jpp    7 年前

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