Python3 sorted函数中key参数的作用原理
高洛峰
高洛峰 2017-04-17 17:47:14
0
3
1482

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(3)
伊谢尔伦

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

いいねを押す +0
洪涛

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

リーリー

結果:

リーリー

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
小葫芦

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

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

リーリー

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

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート