Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法理解python中的排序_Python_Sorting - Fatal编程技术网

无法理解python中的排序

无法理解python中的排序,python,sorting,Python,Sorting,我遇到了一个从字符串数组中查找最大数的代码段。但是我无法理解比较是如何工作的,因为我们只传递一个参数,即列表,但在lt方法中,它需要两个参数 class Largenum(str): def __lt__(x,y): return x+y > y+x lgs=''.join(sorted(map(str,[3, 30, 34, 5, 9]),key=Largenum)) sorted函数显然不会直接调用此类的\uuuult\uuuuuu方法。它将在类的单个成员对

我遇到了一个从字符串数组中查找最大数的代码段。但是我无法理解比较是如何工作的,因为我们只传递一个参数,即列表,但在lt方法中,它需要两个参数

class Largenum(str):
    def __lt__(x,y):
        return x+y > y+x

lgs=''.join(sorted(map(str,[3, 30, 34, 5, 9]),key=Largenum))

sorted
函数显然不会直接调用此类的
\uuuult\uuuuuu
方法。它将在类的单个成员对上重复调用此方法,以便按排序顺序排列它们。您可以通过向方法中添加一个简单的
print
来轻松确定这一点

>>> class Largenum(str):
...     def __lt__(x,y):
...         result = x+y > y+x
...         print('# __lt__({0!r}, {1!r}) => {2}'.format(x, y, result))
...         return result
...
>>> lgs=''.join(sorted(map(str,[3, 30, 34, 5, 9]),key=Largenum))
# __lt__('30', '3') => False
# __lt__('34', '30') => True
# __lt__('34', '30') => True
# __lt__('34', '3') => True
# __lt__('5', '3') => True
# __lt__('5', '34') => True
# __lt__('9', '3') => True
# __lt__('9', '34') => True
# __lt__('9', '5') => True
>>> lgs
'9534330'

这段代码所做的与您期望的不同。您是指
cmp
参数而不是
?如果您将所有数字按在一起形成一个大数字,并且如果您希望在这样做时获得最大的数字,那么您将希望首先获取最大的词典数字。按字母顺序排序,所以“9”>87654321,即使它是一个小得多的数字。排序函数在内部使用“小于”比较。(虽然它可以直接执行reverse=True,而不必为键或cmp费心。)非常感谢,还有一个疑问,为什么我们需要继承str类?我想,您从哪个类派生并不重要,只要它对所有内容都有方法(这里只有少数方法是非常必要的)但是,您当然需要一个加法具有串联语义的方法(或者
方法必须以不同的方式实现)。
map
已经将数字转换为
str
,因此这是一个显而易见的自然选择。非常感谢