【问题标题】:Python, accessing dictionary with wildcardsPython,使用通配符访问字典
【发布时间】:2014-01-28 06:36:40
【问题描述】:

我有一个包含项目的字典,其中的键是某种正则表达式。我正在寻找一个函数来在传递匹配字符串时返回匹配项列表

d = {'a.b': item1, 'b.c':item2}

func(d,'a1b')
>>> [item1]

func(d,'b2c')
>>> [item2]

有没有一种pythonic方法可以做到这一点?我能想到的唯一解决方案是:

import re
def func(d, event):
    res = list()
    for key, item in d.iteritems():
        if re.match(key, event):
            res.append(item)
    return res

【问题讨论】:

    标签: python regex dictionary


    【解决方案1】:

    您可以创建一个包装字典类的类来为您执行此操作:

    import re
    
    class RegexDict(dict):
    
        def get_matching(self, event):
            return (self[key] for key in self if re.match(key, event))
    

    使用示例:

    >>> d = {'a.b': 'item1', 'b.c': 'item2'}
    >>> rd = RegexDict(d)
    >>> for o in rd.get_matching('a1b'):
        print o
    
    
    item1
    

    这使您不必依赖外部函数,它使开销很小,并且更健壮。

    您还可以添加另一个函数,该函数将列表(或迭代器)作为输入并返回所有匹配值:

        def get_all_matching(self, events):
            return (match for event in events for match in self.get_matching(event))
    
    >>> for o in rd.get_all_matching(['a1b', 'b2c']):
        print o
    
    
    item1
    item2
    

    【讨论】:

      【解决方案2】:

      您不需要遍历这些值。关键就够了:

      import re
      def func(d, event):
          res = []
          for key in d.keys():
              if re.match(key, event):
                  res.append(d[key])
          return res
      

      这是一个生成器版本。这个更快,因为它不存储整个列表,而只在需要时生成它:

      def func(d, event):
          for key in d.keys():
              if re.match(key, event):
                  yield d[key]
      

      还有一个班轮:

      #1 List Comprehension
      return [d[key] for key in d.keys() if re.match(key, event)]
      #2 Generator Expression
      return (d[key] for key in d.keys() if re.match(key, event))
      

      【讨论】:

      • 你不是说 d.keys() 吗?
      • @InbarRose 等一下,我今天有点慢。哪一个?
      • 哦哈哈哈。固定的!对此感到抱歉。谢谢!
      • 修复了您的 gen 表达式。
      最近更新 更多