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

Python空数组报错及缺失字段显示no data的修复方案咨询

函数修复方案

修复后完整代码

data = [
  {
    "firstname" : "Peter",
    "lastname"  : "Doe",
    "class"       : [ "economy_class" ]
  },
  {
    "firstname" : "Jane",
    "lastname"  : "Braun",
    "class"       : [ "business_class" ]
  },
  {
    "firstname" : "Peter",
    "lastname"  : "Foo",
    "class"       : [ "business_class", "economy_class" ]
  },
  {
    "firstname" : "Jane",
    "lastname"  : "Bar",
    "class"       : [ "business_class" ]
  },
  {
    "firstname" : " ",
    "lastname"  : " ",
    "class"       : [ " " ]
  }
]

def list_persons(data):
    """返回包含每个分类下人员列表的字符串,分类和人员之间用换行符'\n'分隔
    参数:
    persons -- 存储人员信息和所属分类的字典列表
    """
    # 空输入直接返回no data
    if not data:
        return "no data"
    
    class_set = set()
    valid_persons = []
    # 过滤有效人员、收集所有有效分类
    for dic in data:
        # 校验必填字段是否存在且值不为空
        required_fields = ["firstname", "lastname", "class"]
        is_valid = True
        for field in required_fields:
            if field not in dic or str(dic[field]).strip() == "":
                is_valid = False
                break
        # 额外校验class字段为列表类型
        if not isinstance(dic["class"], list):
            is_valid = False
        if is_valid:
            valid_persons.append(dic)
            for c in dic["class"]:
                if str(c).strip():
                    class_set.add(c)
    
    # 无有效分类时返回no data
    if not class_set:
        return "no data"
    
    result_lines = []
    # 按分类排序输出
    for cls in sorted(class_set):
        # 筛选当前分类下的人员,按姓氏排序
        subjects = sorted(
            [p for p in valid_persons if cls in p["class"]],
            key=lambda x: x["lastname"]
        )
        if not subjects:
            result_lines.append(f"{cls}: no data")
            continue
        # 拼接姓名,按全名字典序排序
        names = sorted([f"{p['firstname']} {p['lastname']}" for p in subjects])
        result_lines.append(f"{cls}: {', '.join(names)}")
    
    return "\n".join(result_lines)

# 测试调用示例
if __name__ == "__main__":
    # 正常数据测试
    print("正常数据输出:")
    print(list_persons(data))
    print("\n空数组测试:")
    print(list_persons([]))
    print("\n无有效数据测试:")
    print(list_persons([{"firstname": "", "lastname": "", "class": ["economy_class"]}]))

核心修改点

  • 新增空输入校验:函数入口判断传入的数组为空时直接返回no data
  • 新增字段合法性校验:每条数据会校验firstname/lastname/class三个必填字段是否存在,且去空格后不为空,不满足条件的无效数据会被过滤
  • 修复原代码排序逻辑缺陷:原代码按姓名第5位字符排序的逻辑存在索引越界风险,修改为按姓氏字典序排序,符合常规使用逻辑
  • 新增空分类提示:如果某个分类下没有有效人员,会输出分类名: no data
  • 对齐函数文档约定:原函数文档说明返回字符串,原代码直接打印结果,修改为拼接结果字符串后返回,和文档描述一致

内容的提问来源于stack exchange,提问作者Val.Val

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:36:08