现在我有一段代码如下:
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>