Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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 - Fatal编程技术网

有没有办法创建一个不可排序的python对象?

有没有办法创建一个不可排序的python对象?,python,Python,是否有可能创建任何不可排序的python对象?因此,当尝试对该对象的列表进行排序时,这将是一个例外? 我创建了一个非常简单的类,没有定义任何比较方法,但是这个类的实例仍然是可比较的,因此是可排序的。也许,我的类从某处继承了比较方法。但是我不希望出现这种行为。您可以在类上定义一个\uuu cmp\uu方法,并在调用它时始终引发异常。这可能会奏效 出于好奇,为什么?为什么不编写一个包含列表对象并提供访问其中数据的方法的类呢?通过这样做,您将有效地隐藏列表,从而阻止他们对其进行排序。正如Will Mc

是否有可能创建任何不可排序的python对象?因此,当尝试对该对象的列表进行排序时,这将是一个例外?
我创建了一个非常简单的类,没有定义任何比较方法,但是这个类的实例仍然是可比较的,因此是可排序的。也许,我的类从某处继承了比较方法。但是我不希望出现这种行为。

您可以在类上定义一个
\uuu cmp\uu
方法,并在调用它时始终引发异常。这可能会奏效


出于好奇,为什么?

为什么不编写一个包含列表对象并提供访问其中数据的方法的类呢?通过这样做,您将有效地隐藏列表,从而阻止他们对其进行排序。

正如Will McCutchen所提到的,您可以定义一个引发异常的
\uuu cmp\uuuu
方法,以阻止园艺品种排序。大概是这样的:

class Foo(object):
    def __cmp__(self, other):
        raise Exception()

a = [Foo(), Foo(), Foo()]
a.sort()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<stdin>", line 3, in __cmp__
Exception

正如其他人所指出的,我不确定阻止某人对对象进行排序是否有多大价值。如果这不仅仅是您想要解决的一个奇怪的问题,那么它的用例是什么?

默认列表排序在其元素上使用内置的
cmp()
函数。
cmp()
函数检查它的参数(列表中的两个元素)是否有
\uuuu cmp\uuuu()
方法。如果是,则使用此方法进行比较。否则,与您的情况一样,参数对象id(内置函数
id()
的返回值)用于比较

要让排序失败,可以定义一个引发异常的比较方法:

>>> class X(object):
...    def __cmp__(self, other):
...        raise StandardError # or whatever Exception you need
...
>>> l = [X(), X(), X()]
>>> l.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in __cmp__
StandardError
>>X类(对象):
...    定义cmp(自身、其他):
...        引发StandardError#或任何您需要的异常
...
>>>l=[X(),X(),X()]
>>>l.排序()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第2行,在cmp中__
标准误差

集合没有总排序

>>> s=set((1,2,3))
>>> t=set("abc")
>>> s<t
False
>>> t<s
False
>>> 

值得一提的是,在Python3中,默认情况是新项目不可比较(因此不可排序)。在Python2中,您必须显式地创建一个
\uuuu cmp\uuuu
\uuu lt\uuuu
方法,正如其他人所说。

Python排序算法使用
\uu lt\uuu
特殊方法。请记住,使用排序函数和方法的
cmp
key
参数,建议您的类定义一个方法:

def __lt__(self, other):
    raise NotImplementedError

谢谢你的快速回答!我找到了一个从序列中删除重复项的最快方法-。检查代码中的注释:“如果不可能,序列元素应该享受总排序,如果list.sort()没有引发TypeError,则假定它们享受总排序。然后unique()通常在O(N*log2(N))时间内工作。”我无法创建不享受总排序的元素。那么这是菜谱作者的错误,还是他真的知道一些我不知道的东西?为什么不直接使用
set()
来获得一个独特元素的列表呢?你为什么用那个食谱?如果你在使用这个配方,并且你让你的对象在排序时总是引发异常,那么这将使用第三种也是最糟糕的方法来确定唯一的项目。是的,请理解,我只是想知道,配方的作者是在从无到有,还是只是试图处理所有可能的情况。所以我想知道,在哪些情况下,第二个解决方案会失败(使用sort)呢?当对象不可散列时,第一个解决方案失败(例如,对列表进行排序),但第二个解决方案失败时,似乎不存在这种情况。顺便说一下,如果列表不可散列,您的解决方案(使用set()获取列表–er)也会失败。>>>a=[[1,1],[1,2],[1,1]]>>>a=list(set(a))类型错误:不可损坏的类型:“list”好吧,我也被难倒了。我不知道第二个解决方案什么时候会失败。。。我想我从来没有遇到过这样一个对象列表,当它被排序时总是出现
TypeError
。你比我快了一分钟。几乎完全相同的示例代码;)这是一个很好和明确的答案!但是是否有任何对象具有内置函数id()?对象id是由Python内部设置的,而不是由对象的方法设置的。通常,例如在基于C的Python中,它只是对象的内存地址(另请参见)。
>>> sorted([s,t])
[set([1, 2, 3]), set(['a', 'c', 'b'])]
def __lt__(self, other):
    raise NotImplementedError