自定义Python列表排序

问题描述 投票:63回答:4

我正在重构我的一些旧代码,并且遇到了这个问题:

alist.sort(cmp_items)

def cmp_items(a, b):
    if a.foo > b.foo:
        return 1
    elif a.foo == b.foo:
        return 0
    else:
        return -1

代码有效(我在大约3年前写过它!)但是我无法在Python文档的任何地方找到这个东西,并且每个人都使用sorted()来实现自定义排序。有人可以解释为什么这有效吗?

python list sorting
4个回答
47
投票

它记录了here

sort()方法采用可选参数来控制比较。

cmp指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于或大于第二个参数:cmp = lambda x,y :cmp(x.lower(),y.lower())。默认值为None。


85
投票

作为旁注,这是实现相同排序的更好选择:

alist.sort(key=lambda x: x.foo)

或者:

import operator
alist.sort(key=operator.attrgetter('foo'))

查看Sorting How To,它非常有用。


10
投票

就像这个例子。你想要排序这个列表。

[('c', 2), ('b', 2), ('a', 3)]

输出:

[('a', 3), ('b', 2), ('c', 2)]

你应该按第二项排序元组,然后是第一项:

def letter_cmp(a, b):
    if a[1] > b[1]:
        return -1
    elif a[1] == b[1]:
        if a[0] > b[0]:
            return 1
        else:
            return -1
    else:
        return 1

最后:

只是sort(letter_cmp)


3
投票

这在Python 3中不起作用。

您可以使用functools cmp_to_key来使旧式比较函数工作。

from functools import cmp_to_key

def cmp_items(a, b):
    if a.foo > b.foo:
        return 1
    elif a.foo == b.foo:
        return 0
    else:
        return -1

cmp_items_py3 = cmp_to_key(cmp_items)

alist.sort(cmp_items_py3)
© www.soinside.com 2019 - 2024. All rights reserved.