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

如何用Python sorted的key函数按元组指向子串字典序排序?

问题解决:按元组指向的子串字典序排序列表

错误原因

你的代码报错是因为:

  • sorted()的key参数需要一个**仅接受单个元素(即列表中的每个元组)**的函数,但你定义的cmp函数需要两个参数
  • 调用cmp(text)时,仅传入了text作为第一个参数,缺少第二个参数,导致参数不匹配报错

正确实现方式

方式1:使用lambda表达式(最简洁)

直接用lambda捕获外部的text变量,为每个元组生成对应的子串作为排序键:

a = [(1,2), (2, 4), (3, 5)]
text = "asdcesa"
# 按元组对应的子串字典序排序
sorted_a = sorted(a, key=lambda t: text[t[0]:t[1]+1])
print(sorted_a)  # 输出: [(3, 5), (2, 4), (1, 2)]

验证:对应子串分别是"sd"、"dce"、"ces",字典序排序后顺序为"ces" < "dce" < "sd",对应元组就是(3,5)、(2,4)、(1,2)

方式2:使用functools.partial绑定参数

如果想保留原来的双参数函数,可以用partial把text参数固定,生成一个单参数函数:

from functools import partial

def get_substring(t, text):
    return text[t[0]:t[1]+1]

a = [(1,2), (2, 4), (3, 5)]
text = "asdcesa"
sorted_a = sorted(a, key=partial(get_substring, text=text))

方式3:用闭包生成key函数

定义一个外层函数接收text,返回一个仅接受元组的内层函数:

def make_key_func(text):
    def key_func(t):
        return text[t[0]:t[1]+1]
    return key_func

a = [(1,2), (2, 4), (3, 5)]
text = "asdcesa"
sorted_a = sorted(a, key=make_key_func(text))

关键注意点

Python3的sorted()不再支持cmp参数,只能通过key参数指定每个元素的排序依据——key函数必须返回一个可比较的值(这里是子串,字符串天然支持字典序比较)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:15:08