You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:13:14