如何实现支持逗号分隔OR条件的姓名列表筛选功能?
优化姓名筛选逻辑以支持逗号分隔的OR条件
问题描述
现有筛选逻辑仅支持单值的startwith/contains/endwith条件,无法处理筛选字典中逗号分隔的多值OR逻辑(例如"Fira, Raja"表示匹配以Fira开头或以Raja开头的姓名),且需要筛选出同时满足所有非空条件的姓名。
解决方案
通过以下步骤实现需求:
- 对每个非空的筛选条件,将逗号分隔的值拆分为去空格后的列表
- 对每个姓名,检查其是否满足所有非空条件:每个条件下只要有一个值匹配即满足该条件(OR逻辑),所有条件都满足则保留该姓名(AND逻辑)
代码实现
def filter_names(filter_dict, names): required_list = [] # 预处理筛选条件,拆分并去除空格 processed_filters = {} for key, value in filter_dict.items(): trimmed_val = value.strip() if trimmed_val: processed_filters[key] = [v.strip() for v in trimmed_val.split(',')] for name in names: is_match = True for condition, values in processed_filters.items(): if condition == 'startwith': condition_met = any(name.startswith(v) for v in values) elif condition == 'contains': condition_met = any(v in name for v in values) elif condition == 'endwith': condition_met = any(name.endswith(v) for v in values) else: condition_met = False if not condition_met: is_match = False break if is_match: required_list.append(name) return required_list
测试示例
示例1
dict1 = {'startwith':"Fira", 'contains':"", "endwith":"Birla"} list_of_names = ["Raja Molli Jira", "Bina Tata Birla", "Fira Kiya Too"] print(filter_names(dict1, list_of_names)) # 输出: ["Bina Tata Birla", "Fira Kiya Too"]
示例2
dict1 = {'startwith':"Fira, Raja", 'contains':"", "endwith":""} list_of_names = ["Raja Molli Jira", "Bina Tata Birla", "Fira Kiya Too"] print(filter_names(dict1, list_of_names)) # 输出: ["Raja Molli Jira", "Fira Kiya Too"]
代码说明
- 预处理筛选条件:过滤空值,拆分逗号字符串并去除每个值的空格,避免空格干扰匹配结果
- 条件匹配逻辑:用
any()实现单个条件内的OR逻辑,只要有一个值匹配即满足当前条件 - 全局匹配逻辑:遍历所有非空条件,只要有一个条件不满足就跳过当前姓名,确保最终结果满足所有要求
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

