2013-02-27 64 views
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]

回答

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]] 
>>> 
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]] 

如果你有排序例如两个字符串字段,一个上升,一个下降它的not quite so easy

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)) 
+0

值得一提的是,这不是用在这种特殊情况下,因为它导致键func被多次调用 - 所以它更慢 – 2013-02-27 20:45:25