首页 > 解决方案 > 如何在python中动态创建return语句

问题描述

我的字典在下面

我正在字典中搜索下面的字典

test=[ { 'id': '1', 'name': 'A', 'businessArea': [ 'Accounting' ], 'Role': [ 'Developer' ], 'Designation': [ 'L2' ] }, { 'id': '2', 'name': 'B', 'businessArea': [ None ], 'Role': [ 'None' ], 'Designation': [ 'None' ] }, { 'id': '3', 'name': 'C', 'businessArea': [ 'Engineering' ], 'Role': [ 'Tester', 'Developer' ], 'Designation': [ 'L1' ] } ]

我的代码在下面工作正常,只返回一个

def contains(item, field, values):
    if field:
        item = item.get(field)     
    if item is None:
        return None                
    if isinstance(item, str):
        return item in values       
    if isinstance(item, list):
        return any(contains(v, None, values) for v in item)  

def validate(d):
    return contains(d, 'businessArea', ['Accounting']) and contains(d, 'Designation', ['L2'])
result = [d for d in test if validate(d)] 
print(result)

我得到了上述代码的一个输出,这是正确的

search_dict会动态地来找我,所以我写了下面的代码,但我得到了完整的测试字典

search_dict  = {'businessArea': ['Research'], 'Designation': ['L2']}
return_string = " and ".join([f"contains(d, '{k}', {v})" for k, v in search_dict .items()])


def contains(item, field, values):
    if field:
        item = item.get(field)     
    if item is None:
        return None                
    if isinstance(item, str):
        return item in values       
    if isinstance(item, list):
        return any(contains(v, None, values) for v in item)  
    
def validate(d):
    return_string = " and ".join([f"contains(d, '{k}', {v})" for k, v in search_dict .items()])
    #print (return_string)
    return return_string
result = [d for d in test if validate(d)] 
print(result)

我得到了不正确的完整字典。

任何类似的替代方法recursion对我来说都很好。

我为什么要写第二个案例。我不想像contains第一种情况那样手动编写排列和组合

标签: python

解决方案


您可以使用all来验证 dict 中的所有项目是否符合条件:

def validate(d):
    return all(contains(d, k, v) for k, v in search_dict.items())

推荐阅读