3
class C:
    def __init__(self,n,x):
        self.n = n
        self.x = x

a = C('a',1)
b = C('b',2)
c = C('c',3)

classList = [b,a,c]

for q in classList: print q.n,

classList.sort(lambda a,b: long(a.x - b.x))

for q in classList: print q.n,

运行上面的代码会得到错误TypeError: comparison function must return int, not long。是否有另一种干净的方法可以按某些类变量对类对象进行排序?

4

4 回答 4

7

使用内置cmp函数:cmp(a.x, b.x)

顺便说一句,您还可以利用 的key参数sort

classList.sort(key=lambda c: c.x)

哪个更快。

根据wiki.python.org

这种技术很快,因为每个输入记录只调用一次键函数。

于 2013-05-25T01:57:21.883 回答
1

我认为你不需要long

class C:
    def __init__(self,n,x):
        self.n = n
        self.x = x

a = C('a',1)
b = C('b',2)
c = C('c',3)

classList = [b,a,c]

for q in classList: print q.n,

classList.sort(lambda a,b: a.x - b.x)

for q in classList: print q.n,

输出:

b a c a b c
于 2013-05-25T02:01:18.733 回答
1

与其使用cmp函数,不如使用key函数——它更高效,并且对它可以返回的类型没有这种限制:

classList.sort(key=lambda a: a.x)

这也是更多的未来证明:cmpPython 3 中不再支持函数,并且在 Python 2 中继续存在以支持旧代码(从以前key存在)。

于 2013-05-25T02:01:38.130 回答
0

您可以将您想要的比较添加到您的课程中:

class C(object):
    def __init__(self,n,x):
        self.n = n
        self.x = x

    def __cmp__(self,other):
        return cmp(self.x,other.x)    
于 2013-05-25T02:06:58.780 回答