5

Google Pythonクラスの問題に取り組んでいる間、Stackoverflowの2〜3の例を使用して次の結果を作成しました-

def sort_last(tuples):
    return [b for a,b in sorted((tup[1], tup) for tup in tuples)]

print sort_last([(1, 3), (3, 2), (2, 1)])

私は昨日リスト内包を学んだので、リスト内包について少し知っていますが、このソリューションが全体的にどのように機能しているか混乱しています。これを理解するのを手伝ってください(機能の2行目)。

4

4 に答える 4

6

そのパターンは、decorate-sort-undecorate と呼ばれます。

  1. それぞれ(1, 3)を に変換し(3, (1, 3))、それぞれを新しいタプルでラップtupleし、最初に並べ替えたい項目を付けます。
  2. tupleオリジナルの 2 番目のアイテムが最初にソートされるように、アウターtupleでソートします。
  3. リストの順序を維持したまま、からから(3, (1, 3))へと戻ります。(1, 3)

Python では、明示的な装飾はほとんどの場合不要です。代わりに、次のkey引数をsorted使用します。

sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1)

tupleまたは、長さに関係なく、の逆バージョンで並べ替えたい場合は、次のようにします。

sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
                              # or key=operator.itemgetter(slice(None, None, -1))
于 2012-04-18T16:46:53.303 に答える
3

それを分解しましょう:

の :[(tup[1],tup) for tup in tuples]

外:[(3, (1, 3)), (2, (3, 2)), (1, (2, 1))]

したがって、最初の値が内側のタプルの最後の値である新しいタプルを作成しました。このようにして、「タプル」内の各タプルの 2 番目の値でソートされます。

次に、返されたリストを並べ替えます。

の:sorted([(3, (1, 3)), (2, (3, 2)), (1, (2, 1))])

外:[(1, (2, 1)), (2, (3, 2)), (3, (1, 3))]

これで、リストが各タプルの 2 番目の値でソートされました。残っているのは元のタプルを抽出することだけであり、これは for ループから b のみを取得することによって行われます。

リスト内包表記は、指定sorted([...]されたリスト (この場合) を反復し、抽出された値を順番に返します。

于 2012-04-18T16:54:41.340 に答える
2

あなたの例1は、リスト内の各タプルの元のタプルが続く index の要素を持つ新しいリストを作成することによって機能します。例えば。(3,(1,3))最初の要素。sorted 関数は index から始まる各要素でソートする0ため、リストは 2 番目の項目でソートされます。次に、関数は新しいリストの各項目を調べて、元のタプルを返します。

これを行う別の方法はkey、 の値に基づいてソートする sorted 関数でパラメータを使用することkeyです。この場合key、各タプルの index の項目を にします1

>>> from operator import itemgetter
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1))
于 2012-04-18T16:45:25.630 に答える