繁体   English   中英

Python,使用通配符访问字典

[英]Python, accessing dictionary with wildcards

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

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

您可以创建一个类来为您包装字典类:

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

这样可以节省您不得不依赖外部功能,它可以减少开销,并且更加强大。

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

    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

您不需要循环遍历值。 关键就够了:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM