为dict重构一个pythonic递归过滤器

时间:2016-04-08 13:33:42

标签: python dictionary recursion refactoring

现在我有一段代码如下:

def checker(dict_element, dict_filter):
    global counter
    counter = 0

    def fullfill_filter(key, value):
        if key in dict_filter:
            if value in dict_filter[key]:
                return True

    def extract_dict(dict_element):
        global counter

        for key, value in dict_element.items():
            if isinstance(value, str):
                if fullfill_filter(key, value):
                    counter += 1
            elif isinstance(value, dict): 
                extract_dict(value)
            elif isinstance(value, list):
                extract_list(key, value)

    def extract_list(key, list_element):
        global counter

        for el in list_element:
            if isinstance(el, dict):
                extract_dict(el)
            if isinstance(el, list):
                extract_list(el)
            if isinstance(el, str):
                if fullfill_filter(key, el):
                    counter += 1

    extract_dict(dict_element)

    if counter == len(dict_filter.keys()):
        return True
    return False

它用于过滤字典dict_element包含各种类型的对象,我想根据dict_filter中的内容找到正确的字体。

例如我有一个字典有两个子字典如下:

list = [
    {
        'services': [],
        'location': {
            'latitude': '51.026',
            'country': 'Germany',
            'longitude': '13.725'
        },
        'available': 'true',
        'technologies': ['Virtual Machines', 'Distributed Systems', 'Internet', 'Wired'],
        'type': 'node',
        'exclusive': 'false',
        'types': [{
            'disk_images': [{
                'version': 'f22',
                'os': 'Linux',
                'name': 'Fedora f22'
            }],

        }]
    }, {
        'services': [],
        'location': {
            'latitude': 'unknown',
            'country': 'Taiwan',
            'longitude': 'unknown'
        },
        'available': 'false',
        'technologies': ['Virtual Machines', 'Distributed Systems', 'Internet',],
        'type': 'node',
        'exclusive': 'false',
        'types': [{
            'disk_images': [{
                'version': 'f24',
                'os': 'Linux',
                'name': 'Fedora f24'
            }],
        }]
    }
]

如果我这样做[checker(dict, dict_filter = {'avaliable': 'true', 'country':'Germany'}) for dict in list][checker(dict, {'version': 'f22'}) for dict in list][checkert(dict, {technologies: 'Wired'} for dict in list] ,我可以过滤掉第二种情况并得到第一个字典,但是,正如你可以看到代码是丑陋和严重命名(不是母语为英语的人),是否有更好,更清晰的方式以pythonic方式重构它? / p>

0 个答案:

没有答案