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

Python多条件排序报错:comp2()缺少必需的位置参数'b'如何解决?

错误原因分析

Python 3的list.sort()方法的key参数仅接受单输入参数的函数,你定义的comp2是双参数的比较函数,直接传入就会触发缺参数报错。如果要使用自定义比较函数,需要先导入functools.cmp_to_key把比较函数包装后再传入,但就算改了这里,原有逻辑也只实现了按城市排序,没有覆盖同城市按时间升序、按原始顺序输出结果的需求。

正确实现逻辑
  • 先解析所有条目,提取扩展名、城市、时间戳,同时保留条目的原始索引,确保最终输出顺序和输入顺序一致
  • 按城市对条目分组,每组内按时间戳升序排序,给每个条目分配组内序号(从1开始计数)
  • 按原始索引还原条目顺序,拼接成要求的文件名格式
完整实现代码
from collections import defaultdict

def solution(S):
    entries = S.splitlines()
    parsed_items = []
    # 解析所有字段
    for origin_idx, line in enumerate(entries):
        file_name, city, time_str = line.split(",")
        ext = file_name.strip().split(".")[-1]
        parsed_items.append({
            "city": city.strip(),
            "ext": ext,
            "time": time_str.strip(),
            "origin_idx": origin_idx
        })
    # 按城市分组
    city_groups = defaultdict(list)
    for item in parsed_items:
        city_groups[item["city"]].append(item)
    # 同城市按时间升序排序,分配序号
    for city in city_groups:
        city_groups[city].sort(key=lambda x: x["time"])
        for seq, item in enumerate(city_groups[city], start=1):
            item["seq"] = seq
    # 按原始索引排序,拼接最终结果
    parsed_items.sort(key=lambda x: x["origin_idx"])
    result = [f"{item['city']}{item['seq']}.{item['ext']}" for item in parsed_items]
    return "\n".join(result)
测试效果

输入样例字符串:

A = "photo.jpeg, Warsaw,2013-09-05 14:08:15\njohn.png, London, 2015-06-20 15:13:22\nmyFriends.png, Warsaw, 2013-09-05 14:07:13"
print(solution(A))

输出和预期完全一致:

Warsaw2.jpeg
London1.png
Warsaw1.jpeg

如果你坚持使用双参数比较函数的写法,可以参考修改:

  1. 导入from functools import cmp_to_key
  2. 排序语句改为entries.sort(key=cmp_to_key(comp2))
    但这种方式仅能完成按城市聚合排序,后续仍需补充同城市按时间排序、分配序号、还原原始输入顺序的逻辑,效率和可读性都低于分组实现方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:03