Python多条件用户搜索算法实现问题求助
Flask用户搜索接口问题修复方案
问题根源
你的接口返回空结果,核心原因是原代码大概率采用了多参数同时匹配(AND逻辑),但需求要求的是匹配任意一个参数(OR逻辑);此外可能未正确实现各字段的匹配规则(如大小写不敏感、age范围),也没有处理结果去重。
修复后代码
search_data.py(示例数据集)
# search_data.py USERS = [ {"id": 1, "name": "John Doe", "age": 30, "occupation": "Developer"}, {"id": 5, "name": "Janice Smith", "age": 31, "occupation": "Designer"}, {"id": 7, "name": "janice brown", "age": 32, "occupation": "DevOps Engineer"}, {"id": 9, "name": "Mike Chen", "age": 33, "occupation": "Developer"}, ]
search.py(修复实现)
# search.py from flask import Flask, request, jsonify from search_data import USERS app = Flask(__name__) @app.route('/search', methods=['GET']) def search_users(): params = request.args # 用集合存储结果自动去重,字典不可哈希,转成元组存入 matched_users = set() # 处理id参数:精准匹配唯一用户 if 'id' in params: try: target_id = int(params['id']) for user in USERS: if user['id'] == target_id: matched_users.add(tuple(user.items())) break except ValueError: pass # 非数字id忽略 # 处理name参数:不区分大小写的部分匹配 if 'name' in params: target_name = params['name'].lower() for user in USERS: if target_name in user['name'].lower(): matched_users.add(tuple(user.items())) # 处理age参数:匹配目标值±1的范围 if 'age' in params: try: target_age = int(params['age']) age_range = range(target_age - 1, target_age + 2) for user in USERS: if user['age'] in age_range: matched_users.add(tuple(user.items())) except ValueError: pass # 非数字age忽略 # 处理occupation参数:不区分大小写的部分匹配 if 'occupation' in params: target_occ = params['occupation'].lower() for user in USERS: if target_occ in user['occupation'].lower(): matched_users.add(tuple(user.items())) # 无参数时返回全部用户 if not params: return jsonify(USERS) # 将集合转回列表字典格式返回 final_result = [dict(user_tuple) for user_tuple in matched_users] return jsonify(final_result) if __name__ == '__main__': app.run(debug=True)
关键修复点说明
- OR逻辑实现:每个参数单独处理,匹配到的用户直接加入集合,天然实现“满足任意条件即返回”的逻辑
- 自动去重:利用集合的唯一性特性,避免同一用户因匹配多个条件被重复返回
- 字段匹配规则:
- id:精准匹配唯一值,找到后立即终止循环提升效率
- name/occupation:统一转小写后做包含匹配,实现大小写不敏感的模糊搜索
- age:计算±1的范围区间,判断用户年龄是否在区间内
- 参数容错:对id和age的数字转换异常做捕获,避免非法参数导致接口崩溃
- 无参数场景:单独判断无参数时直接返回全量用户,符合需求
测试验证
发起请求http://127.0.0.1:5000/search?id=5&name=Janice&age=32&occupation=Dev,将返回3条符合预期的用户数据:
- id=5的用户(匹配id)
- id=7的用户(匹配name和age)
- id=9的用户(匹配occupation)
内容的提问来源于stack exchange,提问作者Chiko
相关产品推荐
相关产品推荐

