在这种情况下,您可以像 @Amber 那样使用复合键。但是,这种方法并不总是有效:例如,如果两个组件都是两个字符长(因为这个-ord(x[1][0])
技巧不再有效),它就会失败。
这是一个更通用的解决方案:
In [15]: X = None
In [16]: some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]
In [17]: l = sorted(some_list, key=lambda (x,y):y[-2:])
In [18]: l = sorted(l, key=lambda (x,y):y[:1], reverse=True)
In [19]: l
Out[19]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]
它一次对列表进行一个标准排序,并利用 Python 的排序是stable的事实。
一种更通用的方法是提供一个比较器:
def f((x1,y1), (x2,y2)):
c = cmp(y1[:1], y2[:1])
if c != 0: return -c
return cmp(y1[-2:], y2[-2:])
这可以按如下方式使用:
In [39]: sorted(some_list, cmp=f)
Out[39]: [[None, '4x01'], [None, '4x02'], [None, '3x01'], [None, '3x02']]