検索

ホームページ  >  に質問  >  本文

Python3 sorted函数中key参数的作用原理

这是一个字符串排序,排序规则:小写<大写<奇数<偶数

s = 'asdf234GDSdsf23'  #排序:小写-大写-奇数-偶数
print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))))

这里key接受的函数返回的是一个元组?是如何进行比较的?

高洛峰高洛峰2786日前1471

全員に返信(3)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:49:14

    最初にタプルの最初の値を比較し、FALSE

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 17:49:14

    簡単な例から始めましょう:

    リーリー

    結果:

    リーリー

    items がタプルのリストである場合、Python の組み込み関数 sorted (または sort) はタプルの最後の要素、つまり 2 つの要素のセットからソートします。タプルは 2 つの基本的なソートとして想像できます:

    原文:

    リーリー

    最初の並べ替えでは 2 番目の要素をキーとして使用するため、並べ替え結果は次のようになります:

    リーリー

    2 番目の並べ替えでは最初の要素をキーとして使用するため、並べ替え結果は次のようになります:

    リーリー

    結論 (1):

    タプルのソートは最後の要素から順にソートされます
    つまり、タプルのソートの重みは最初の要素から始まり、後方に向かって減少します


    次に、ブール値の並べ替えを観察してみましょう:

    リーリー

    結果:

    リーリー

    結論 2:

    ブールソートでは、False が前に配置され、True が下

    に配置されます。

    次に、あなたが示した例を見てみましょう。結果を観察するための簡単な関数を作成してみましょう。

    リーリー

    関数 show は、ソート中に各文字のタプルキーを生成するために使用される現在の文字列 s を出力します。

    次に、先ほどの結論 1 を適用します。キーとしてタプルを使用する代わりに、同等の を使用してキーを最後の要素から順にソートし、 とタプルの変更を徐々に観察します。キー:s リーリー

    予想どおり、結論 (1) によれば、このアプローチは確かにタプルをキーとして一度にソートするのと同等であることがわかります。

    同時に、結論 (2) に注目してください。
    isdigit()isupper() などによって生成されたブール キーについても、ソート結果は期待どおりです。 islower() リーリー


    しかし、これは偶然の結果なので最終的な結論ではないと思います (偶然というには言い過ぎかもしれません。あまり直感的ではない結果と言うべきです)。

    に基づいて結論を出しましょう。結論 (1) 元の例の分析: リーリー

    この並べ替えは次のように変換できます:

    まず文字 x 自体をソートし、次にその文字が小文字か大文字か偶数か数字かどうかをソートします。

    は次のように翻訳することもできます:

    文字が数字であるかどうかを最も高いソート重みとして使用し、次に文字が偶数であるかどうか、文字が大文字であるかどうか、文字が小文字であるかどうか、および文字 x 自体を次のように使用します。重量。

    これは最初の目標 (#Sort: 小文字-大文字-奇数-偶数) とは異なるようですが、少なくとも目標と直感的な対応関係はありません。

    次のように変更することをお勧めします:

    リーリー

    これは次のように解釈できます:

    文字が小文字であるかどうかを最大の重みとして使用し、次に文字が大文字であるかどうか、文字が奇数であるかどうか、文字 x 自体を重みとしてソートします

    興味深いのは、判定式が True である文字は、ソートが完了した後に前の位置と比較したいため、結論 (2) に基づいて、一致するように not を追加します。文字を前面に置くことができます。

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 17:49:14

    重要な点は、donghui が言ったように、FALSEキーはタプルのソート状況です。ソートされる各要素はタプル(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)に基づいてソートされ、falseが最初にランク付けされ、trueが最後にランク付けされます。それらは同じです。次を参照してください。ソートは最終的にソートが必要な要素を返します。

    テストコードは次のとおりです: (dokelungdonghui より)

    リーリー

    実行して入力を表示し、パターンを発見します。
    出力:

    リーリー

    返事
    0
  • キャンセル返事