2

いいタイトルが出せなくてすみません。

私はリストを持っています:

some_list = [[X, '4x01'], [X, '3x02'], [X, '4x02'], [X, '3x01']]

X私が気にしないものはどこにありますか。

次の優先順位でリストの 2 番目の要素を並べ替えたい:

  1. 降順の最初の文字。
  2. 昇順の最後の 2 文字。

最終的な出力は次のようになります。

some_list = [[X, '4x01'], [X, '4x02'], [X, '3x01'], [X, '3x02']]

:間違った答えを与える解決策は次のとおりです。

output = sorted(some_list, key=lambda lis: lis[3], reverse=True)
4

2 に答える 2

1

この場合、@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']]
于 2013-01-04T08:00:57.423 に答える