Python类继承str、sorted用类作key的相关技术疑问
关于Python最大数拼接代码的疑问解答
先贴出你提到的代码:
class LargerNumKey(str): def __lt__(x, y): return x+y > y+x class Solution: def largestNumber(self, nums): largest_num = ''.join(sorted(map(str, nums), key=LargerNumKey)) return '0' if largest_num[0] == '0' else largest_num
你的理解是对的:这段代码通过自定义排序规则,让字符串形式的数字按ab > ba的逻辑排序,最终拼接出最大的数。下面逐个解答你的疑问:
疑问解答
1. LargerNumKey类定义中传入str作为参数是什么含义?
这是Python的类继承语法,意思是LargerNumKey类直接继承了内置的str字符串类。这样做的好处是:
LargerNumKey的实例自动拥有str类的所有功能(比如字符串拼接、长度计算等),不用重复实现;- 当我们把字符串传入
LargerNumKey时,会直接复用str的构造逻辑,把输入转换成字符串对象。
2. 为何要定义新类而非函数作为sorted的key参数?
sorted的key参数如果传函数,只能给单个元素生成一个“排序依据值”,然后基于这个值的默认规则(比如字符串字典序)排序。但我们需要的是自定义两个元素之间的比较逻辑——判断x+y是否大于y+x,这是函数做不到的。
当把LargerNumKey作为key时,每个元素会被转换成LargerNumKey的实例,而我们重写了它的__lt__(小于比较)方法。sorted内部会调用这个方法来判断元素的先后顺序,刚好满足我们的排序需求。
3. __lt__方法中的x是否代表常规写法里的self?
没错,x就是常规类方法里的self,只是换了个名字。Python对类方法的第一个参数名称没有强制要求,只是大家习惯用self指代实例本身。这里用x是因为在比较场景里,x和y都是要对比的对象,名字更直观。
内容的提问来源于stack exchange,提问作者Shisui
相关产品推荐
相关产品推荐

