Python中有没有一种神奇的sorted()方法?

2024-10-01 09:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类成员的方式。例如,len()和{}的行为可以通过魔法方法__len__()和{}来重写:

class EmptySet(object):
    def __len__(self):
        return 0

    def __str__(self):
        return '[]'

>>> e = EmptySet()
>>> str(e)
[]

>>> len(e)
0

还有__cmp__()__ge__()__le__()等方法来控制如何比较这些对象,以及它们的列表如何按list.sort()排序。我的问题不是定制列表中对象的顺序,而是对对象本身进行排序。假设集合不是空的,我想用sorted()对它进行排序:

^{pr2}$

有没有一种神奇的方法可以让sorted()在元素不按顺序排列时翻转它们?我在想象以下行为:

>>> s = SetOfTwo(2, 1)
>>> str(s)
[2, 1]

>>> t = sorted(s)
>>> str(t)
[1, 2]

>>> type(t)
>>> SetOfTwo

Tags: 对象方法函数self列表lenreturn排序
3条回答

len()str()是以对象为参数并返回整数(resp。字符串)。对象可以通过__len__()__str__()魔术方法个性化计算len或生成字符串的方式。在

类似地,sorted()是一个接受对象列表(或任何iterable)并返回排序对象列表的函数。对象可以通过__lt__()魔术方法对它们进行比较。在

当我们把“sorted(my_list)看作是一个“对列表排序”的函数,而不是“对列表的元素进行排序”时,就会产生一些混淆。在

你不想对你的对象进行排序(例如,建立一个有序的对象列表),而只需对一些内部表示的数据进行排序。因此,您需要在对象上使用一个实例方法来更新该内部表示。您可以随意命名它,.sort()如果您愿意的话,但是您必须在您的一个对象上调用它,并且它不会涉及到对象的比较。在

您应该阅读关于如何模拟容器类型的the official documentation。基本上,一个应该作为容器工作的类(list、dict等)需要实现方法来设置或获取成员__getitem__()__setitem__(),并迭代项目{},并获得项数-方法__len__()这是最低要求。但您也可以添加删除项和其他操作的功能。

sorted()内置函数的行为是迭代容器中的元素,并使用您提到的__cmp__(), __ge__(), __le__()方法对它们进行比较,这些方法应该是为项目而不是容器定义的。然后创建一个新的list实例,其中的项已排序,并返回这个新实例。然后可以将其传递给自定义容器的构造函数,也可以使用自定义函数wrap sorted(),该函数将返回所需的类实例。在

正如一些人在评论中所说,集合是无序的,但我不认为你的问题是关于集合的。在

Python使用您提到的数据模型方法,gelecmp来确定在调用sorted()时类的行为。您可以看到我如何在这里调用它,但是Python对象并要求我实现<;。在

>>> class a(object):
...   pass
...
>>> b = a()
>>> c = a()
>>> d = [b, c]
>>> sorted(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'a' and 'a'

希望这有帮助。另外,正如其他人所说,在收藏.abc. 为了得到一个好主意,我阅读了《高效python中的第28条。在

相关问题 更多 >