1

我有一个列表列表,

mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['333',90]]

这是一个基于使用以下函数的排序(降序)列表

排序(mylist,key=lambda x: (x[1],x[0]), reverse=True)

我想以这种方式排序,所以我得到以下顺序

[['222',100], ['555',100], ['sss', 100], ['zzz', 100], ['333',90]]

即按desc分数 x[1] 排序,其中按asc值 x[0] 排序

4

3 回答 3

6

你很亲密,很幸运。

幸运是因为:

您至少有一个数值,您可以取反以创建不同的订单

关闭是因为,

这就是你所缺少的

>>> mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['333',90]]
>>> sorted(mylist, key = lambda e: (-e[1], e[0]))
[['222', 100], ['555', 100], ['sss', 100], ['zzz', 100], ['333', 90]]
>>> 
于 2013-02-27T12:15:11.577 回答
3

如果您需要反转数字字段的顺序,这很容易,只需将其取反即可

>>> mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['333',90]]
>>> sorted(mylist, key=lambda x:(-x[1], x[0]))
[['222', 100], ['555', 100], ['sss', 100], ['zzz', 100], ['333', 90]]

例如,如果您必须对两个字符串字段进行排序,一个升序和一个降序,那就不太容易了

于 2013-02-27T12:15:33.810 回答
3

在不能使用否定的情况下,例如所有元素都是字符串,你可以创建一个比较函数,并使用functools.cmp_to_key它来将其转换为一个关键函数。

from functools import cmp_to_key
mylist = [['zzz', 100], ['sss', 100], ['555',100], ['222',100], ['222',90]]
def f(a, b):
    return cmp(a[0], b[0]) or -cmp(a[1], b[1])
sorted(mylist, key=cmp_to_key(f))
于 2013-02-27T12:24:13.287 回答