自定义Python列表排序

Lor*_*nzo 76 python sorting list

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

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
Run Code Online (Sandbox Code Playgroud)

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

And*_*ark 91

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

alist.sort(key=lambda x: x.foo)
Run Code Online (Sandbox Code Playgroud)

或者:

import operator
alist.sort(key=operator.attrgetter('foo'))
Run Code Online (Sandbox Code Playgroud)

查看排序方法,这非常有用.

  • TIL有关运算符,非常有用。 (2认同)

mil*_*s82 53

在这里记录.

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

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

  • 哇,这是文档中一个非常令人震惊的错误. (5认同)
  • @HelloGoodbye sort() 在 Python 3 中没有 cmp 参数。当文档链接适用于 Python 2 时,这是一个旧答案。您可以在[此处](https://docs.python.org/ 2/library/stdtypes.html#mutable-sequence-types) 或阅读更多相关信息 [此处](https://docs.python.org/3/howto/sorting.html#the-old-way-using-the -cmp 参数)。如果您使用的是 Python 3,请改用 [key argument](https://docs.python.org/3/library/stdtypes.html#list.sort)。 (4认同)

The*_*Cat 14

这在 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)
Run Code Online (Sandbox Code Playgroud)


小智 10

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

[('c', 2), ('b', 2), ('a', 3)]
Run Code Online (Sandbox Code Playgroud)

输出:

[('a', 3), ('b', 2), ('c', 2)]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

最后:

只是 sort(letter_cmp)

  • 它如何知道要对哪个列表进行排序? (4认同)
  • @CameronMonks yourList.sort(letter_cmp) (2认同)

Ash*_*ddi 8

我知道很多人已经发布了一些很好的答案。但是,我想建议一种无需导入任何库的简单易用的方法。

l = [(2, 3), (3, 4), (2, 4)]
l.sort(key = lambda x: (-x[0], -x[1]) )
print(l)
l.sort(key = lambda x: (x[0], -x[1]) )
print(l)
Run Code Online (Sandbox Code Playgroud)

输出将是

[(3, 4), (2, 4), (2, 3)]
[(2, 4), (2, 3), (3, 4)]
Run Code Online (Sandbox Code Playgroud)

输出将根据我们在元组格式中提供的参数的顺序进行排序

  • 对于排序,首先,它将检查元组中的第一项,然后尝试根据您给出的符号进行排序(“-”表示反向排序)。如果它无法使用第一项进行排序,那么它会考虑元组中的第二项......依此类推...... (2认同)

Ste*_*ven 6

更好的是:

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]

sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Run Code Online (Sandbox Code Playgroud)

摘自:https: //docs.python.org/3/howto/sorting.html