この場合、@Amber のように複合キーを使用できます。ただし、このアプローチは常に機能するとは限りません。たとえば、両方のコンポーネントが 2 文字の長さの場合、失敗します (-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']]
一度に 1 つの基準でリストをソートし、Python のソートが安定しているという事実を利用します。
さらに一般的なアプローチは、コンパレーターを提供することです。
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']]