Python,使用通配符访问字典

7

我有一个字典,其条目的键是某种正则表达式。我正在寻找一个函数,当传入匹配字符串时,返回一列表示匹配项。

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
2个回答

14
你可以创建一个类来包装字典类,以便为你完成这个任务:
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

9
你不需要遍历值,只需要遍历键即可:

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))

3
你是不是指的是 d.keys()? - Inbar Rose
@InbarRose 等一下,我今天有点慢。你是指哪个? - aIKid
哦哈哈哈哈。问题解决了!对此很抱歉。谢谢! - aIKid
修正了你的生成表达式。 - Inbar Rose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接