这是一个字符串排序,排序规则:小写<大写<奇数<偶数
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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
最初にタプルの最初の値を比較し、FALSE
簡単な例から始めましょう:
結果:
items がタプルのリストである場合、Python の組み込み関数 sorted (または sort) はタプルの最後の要素、つまり 2 つの要素のセットからソートします。タプルは 2 つの基本的なソートとして想像できます:
items
sorted
sort
原文:
最初の並べ替えでは 2 番目の要素をキーとして使用するため、並べ替え結果は次のようになります:
2 番目の並べ替えでは最初の要素をキーとして使用するため、並べ替え結果は次のようになります:
結論 (1):
タプルのソートは最後の要素から順にソートされますつまり、タプルのソートの重みは最初の要素から始まり、後方に向かって減少します
次に、ブール値の並べ替えを観察してみましょう:
結論 2:
ブールソートでは、False が前に配置され、True が下
False
True
次に、あなたが示した例を見てみましょう。結果を観察するための簡単な関数を作成してみましょう。
関数 show は、ソート中に各文字のタプルキーを生成するために使用される現在の文字列 s を出力します。
show
s
次に、先ほどの結論 1 を適用します。キーとしてタプルを使用する代わりに、同等の を使用してキーを最後の要素から順にソートし、 とタプルの変更を徐々に観察します。キー:s リーリー
同時に、結論 (2) に注目してください。、isdigit()、isupper() などによって生成されたブール キーについても、ソート結果は期待どおりです。 islower() リーリー
isdigit()
isupper()
islower()
に基づいて結論を出しましょう。結論 (1) 元の例の分析: リーリー
まず文字 x 自体をソートし、次にその文字が小文字か大文字か偶数か数字かどうかをソートします。
文字が数字であるかどうかを最も高いソート重みとして使用し、次に文字が偶数であるかどうか、文字が大文字であるかどうか、文字が小文字であるかどうか、および文字 x 自体を次のように使用します。重量。
リーリー
文字が小文字であるかどうかを最大の重みとして使用し、次に文字が大文字であるかどうか、文字が奇数であるかどうか、文字 x 自体を重みとしてソートします
興味深いのは、判定式が True である文字は、ソートが完了した後に前の位置と比較したいため、結論 (2) に基づいて、一致するように not を追加します。文字を前面に置くことができます。
not
重要な点は、donghui が言ったように、FALSEキーはタプルのソート状況です。ソートされる各要素はタプル(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)に基づいてソートされ、falseが最初にランク付けされ、trueが最後にランク付けされます。それらは同じです。次を参照してください。ソートは最終的にソートが必要な要素を返します。
donghui
(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
テストコードは次のとおりです: (dokelung と donghui より)
dokelung
実行して入力を表示し、パターンを発見します。 出力:
最初にタプルの最初の値を比較し、FALSE
簡単な例から始めましょう:
リーリー結果:
リーリーitems
がタプルのリストである場合、Python の組み込み関数sorted
(またはsort
) はタプルの最後の要素、つまり 2 つの要素のセットからソートします。タプルは 2 つの基本的なソートとして想像できます:原文:
リーリー最初の並べ替えでは 2 番目の要素をキーとして使用するため、並べ替え結果は次のようになります:
リーリー2 番目の並べ替えでは最初の要素をキーとして使用するため、並べ替え結果は次のようになります:
リーリー結論 (1):
タプルのソートは最後の要素から順にソートされます
つまり、タプルのソートの重みは最初の要素から始まり、後方に向かって減少します
次に、ブール値の並べ替えを観察してみましょう:
リーリー結果:
リーリー結論 2:
ブールソートでは、
に配置されます。False
が前に配置され、True
が下次に、あなたが示した例を見てみましょう。結果を観察するための簡単な関数を作成してみましょう。
リーリー関数
show
は、ソート中に各文字のタプルキーを生成するために使用される現在の文字列s
を出力します。次に、先ほどの結論 1 を適用します。キーとしてタプルを使用する代わりに、同等の を使用してキーを最後の要素から順にソートし、 とタプルの変更を徐々に観察します。キー:
予想どおり、結論 (1) によれば、このアプローチは確かにタプルをキーとして一度にソートするのと同等であることがわかります。s
リーリー同時に、結論 (2) に注目してください。
、
isdigit()
、isupper()
などによって生成されたブール キーについても、ソート結果は期待どおりです。islower()
リーリーしかし、これは偶然の結果なので最終的な結論ではないと思います (偶然というには言い過ぎかもしれません。あまり直感的ではない結果と言うべきです)。
に基づいて結論を出しましょう。結論 (1) 元の例の分析: リーリー
この並べ替えは次のように変換できます:リーリー
これは次のように解釈できます:興味深いのは、判定式が
True
である文字は、ソートが完了した後に前の位置と比較したいため、結論 (2) に基づいて、一致するようにnot
を追加します。文字を前面に置くことができます。重要な点は、キーはタプルのソート状況です。ソートされる各要素はタプル
donghui
が言ったように、FALSE(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
に基づいてソートされ、falseが最初にランク付けされ、trueが最後にランク付けされます。それらは同じです。次を参照してください。ソートは最終的にソートが必要な要素を返します。テストコードは次のとおりです: (
リーリーdokelung
とdonghui
より)実行して入力を表示し、パターンを発見します。
リーリー出力: