2013-02-27 66 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