如何用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
相关产品推荐
相关产品推荐

