python - 在python中对类实例进行排序

标签 python sorting

python 2.7 使用什么来对 vanilla 类实例进行排序?我对默认排序行为很感兴趣。

假设我有课

class S():
    pass

然后我可以创建几个实例,并对它们进行排序:

a = S(); b = S(); c = S()
l = [(a,'a'), (b,'b') ,(c, 'c')]
sorted(l)

这将打印对象的一些排序。现在我有一个分为两部分的问题:

  • python 是否使用对象的 __hash__(),以及它们的 id()
  • 是否可以覆盖 __hash__() 来影响排序行为?

最佳答案

Python 3 的内置排序在您的类中使用了 __lt__ 方法。

丰富的比较方法在 Python 中是特殊的,因为如果没有定义 __lt__,它们可以返回一个特殊的 NotImplemented 类型——看看这个页面上的文档: http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy

由于 NotImplemented 的真值是 True,任何获得 NotImplemented 的 bool 比较将继续,就好像第一个元素实际上小于第二个,这将导致排序以与原来相同的顺序离开列表。

看看交互式 shell。您可以看到如何在排序中使用真值,并且 Python 认为两个对象都小于彼此:

>>> class S():
...     pass
...
>>> a = S()
>>> b = S()
>>> a.__lt__( b )
NotImplemented
>>> if a.__lt__( b ):
...     print( "derp!" )
...
derp
>>> if b.__lt__(a):
...     print( "derp" )
...
derp

这里还有一些引用资料:

编辑: 查看 Python 2.7 后,对象的 ID 似乎用于排序,并且 __lt__ 方法在像您的示例这样的简单类上未定义。抱歉造成任何混淆。

关于python - 在python中对类实例进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650401/

相关文章:

android - 对包含两种数据类的 ArrayList<Any> 进行排序

使用映射值的 Java 比较器排序问题

python - 是否可以覆盖用于调用 Django 的管理员删除确认页面的方法?

python - CountVectorizer 删除只出现一次的特征

python - 崇高文本 3 API : Get all text from a file

java - 根据文本字段过滤jTable

java - 使用键对 ArrayList/HashMap 进行排序

python - 我在哪里可以找到发布 GIL 的 numpy 函数列表?

python - 具有两个以上输入的 Keras 自定义指标

javascript - 使用indexOf时数组排序不正确/不可预测?