比较函数必须返回 int 类型,而不是 long。

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个回答

7

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

另外,您还可以利用sortkey参数:

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

这个方法更快。

根据wiki.python.org的说法:

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


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

1

使用key函数而不是cmp函数,它更加高效,并且没有类型返回的限制:

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

这也更具有未来的可扩展性: cmp 函数在Python 3中不再支持,并继续存在于Python 2中以支持旧代码(在 key 存在之前的代码)。

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)    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接