当前位置: 首页 > 知识库问答 >
问题:

Python中的sorted()有神奇的方法吗?

孙德本
2023-03-14

我知道python中有一些神奇的方法可以被类覆盖,以控制某些内置函数处理这些类成员的方式。例如,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()对其进行排序:

class SetOfTwo(object):
    def __init__(self, a , b):
        el_0 = a
        el_1 = b

    def __len__(self):
        return 2

    def __str__(self):
        return '[{}, {}]'.format(el_0, el_1)

有没有一个神奇的方法,我可以实现有sorted()翻转元素,如果他们不按顺序?我正在想象以下行为:

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

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

>>> type(t)
>>> SetOfTwo

共有3个答案

何松
2023-03-14

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

类似地,sorted()是一个函数,它获取对象列表(或任何iterable)并返回已排序对象的列表。对象可以通过\uu lt\uuu()魔术方法对它们进行比较的方式进行个性化设置。

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

您不希望对对象进行排序(即,创建对象的有序列表),而只对其内部表示形式中的某些数据进行排序。因此,您需要在对象上使用一个实例方法来更新该内部表示。您可以随意命名,。sort()如果您愿意,但是您必须在一个对象上调用它,并且它不会参与比较对象。

澹台庆
2023-03-14

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

Python使用您提到的数据模型方法ge、le和cmp来确定调用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'

希望这有帮助。另外,正如其他人所说,在集合中对某些内容进行子类化是一个好主意。美国广播公司。我阅读了有效python中的第28项,其中谈到了这一点,以获得一个好的想法。

郦翰学
2023-03-14

您肯定应该阅读关于如何模拟容器类型的官方文档。基本上,假定用作容器的类(列表、dict等)需要实现方法来设置或获取成员\uuu getitem\uuuuuuuu()\uuuuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(),并迭代项\uuuuuuuuuuuuuuuuuuuuuuuuuuuu()。这是最低限度。但您也可以添加删除项目和其他操作的功能。

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

 类似资料:
  • 如何使用类的对象调用函数?

  • 本文向大家介绍python的sorted用法详解,包括了python的sorted用法详解的使用技巧和注意事项,需要的朋友参考一下 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。 排序,数字、字符串按照ASCII,中文按照unicode从小到大排序   如果需要一个排序好的副本,同时保持原有列表不变,怎么实现呢?   注意:y

  • 紫色透露着诡异的气息,所以能制造奇幻的效果。各种彩度与亮度的紫色,配上橘色和绿色,便是刺激与新奇的最佳代言人。如果紫色配上黄绿色或黄橘色,色调不合、怪异,而且俗不可耐,但如果配上它真正的补色——黄色,便能展现怪诞、诡异的感觉,令人不禁要驻足,欣赏一番。 以现代流行语来说,紫色象征“青涩”或“未成年”,常被用以代表两代关系之间的沟通桥梁。 补色色彩组合 二次色色彩组合 单色色彩组合 40 87 36

  • 我有一个问题,我在测试中也找不到答案。方法pos和neg对我不起作用。 假设我们有一个简单的类: 现在,我想重写magic方法,它在我做语句时被调用: 如果是c: 但我不知道是哪个?请给我一些建议。

  • 本文向大家介绍详解PHP神奇又有用的Trait,包括了详解PHP神奇又有用的Trait的使用技巧和注意事项,需要的朋友参考一下 php和java,c++一样都是单继承模式。但是像python,是支持多继承(即Mixin模式)。那么如何在php中实现多继承模式?这就需要使用trait。 Trait使用场景 有些功能不需要类的方法属性,但是在不同的类都有使用需求。例如上面的对象转数组方法。这种情况可以

  • 问题内容: 我试图向某人解释为什么他们应该使用Python的内置sorted()函数而不是滚动自己的函数,但我意识到我不知道它使用什么算法。 如果重要的话,我们说的是python 2.7 问题答案: Python使用一种称为Timsort的算法: Timsort是一种混合排序算法,是从合并排序和插入排序派生而来的,旨在对多种现实数据表现良好。它是由Tim Peters在2002年发明的,用于Pyt