这是一个字符串排序,排序规则:小写<大写<奇数<偶数
s = 'asdf234GDSdsf23' #排序:小写-大写-奇数-偶数
print("".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x))))
这里key接受的函数返回的是一个元组?是如何进行比较的?
PHP中文网2017-04-17 17:49:14
簡単な例から始めましょう:
リーリー結果:
リーリーitems
がタプルのリストである場合、Python の組み込み関数 sorted
(または sort
) はタプルの最後の要素、つまり 2 つの要素のセットからソートします。タプルは 2 つの基本的なソートとして想像できます:
原文:
リーリー最初の並べ替えでは 2 番目の要素をキーとして使用するため、並べ替え結果は次のようになります:
リーリー2 番目の並べ替えでは最初の要素をキーとして使用するため、並べ替え結果は次のようになります:
リーリー結論 (1):
タプルのソートは最後の要素から順にソートされます
つまり、タプルのソートの重みは最初の要素から始まり、後方に向かって減少します
次に、ブール値の並べ替えを観察してみましょう:
リーリー結果:
リーリー結論 2:
ブールソートでは、False
が前に配置され、True
が下
次に、あなたが示した例を見てみましょう。結果を観察するための簡単な関数を作成してみましょう。
リーリー関数 show
は、ソート中に各文字のタプルキーを生成するために使用される現在の文字列 s
を出力します。
次に、先ほどの結論 1 を適用します。キーとしてタプルを使用する代わりに、同等の を使用してキーを最後の要素から順にソートし、 とタプルの変更を徐々に観察します。キー:s
リーリー
同時に、結論 (2) に注目してください。
、isdigit()
、isupper()
などによって生成されたブール キーについても、ソート結果は期待どおりです。 islower()
リーリー
に基づいて結論を出しましょう。結論 (1) 元の例の分析: リーリー
この並べ替えは次のように変換できます:
まず文字 x 自体をソートし、次にその文字が小文字か大文字か偶数か数字かどうかをソートします。は次のように翻訳することもできます:
文字が数字であるかどうかを最も高いソート重みとして使用し、次に文字が偶数であるかどうか、文字が大文字であるかどうか、文字が小文字であるかどうか、および文字 x 自体を次のように使用します。重量。これは最初の目標 (#Sort: 小文字-大文字-奇数-偶数) とは異なるようですが、少なくとも目標と直感的な対応関係はありません。
次のように変更することをお勧めします:
リーリー
これは次のように解釈できます:
文字が小文字であるかどうかを最大の重みとして使用し、次に文字が大文字であるかどうか、文字が奇数であるかどうか、文字 x 自体を重みとしてソートします
興味深いのは、判定式が True
である文字は、ソートが完了した後に前の位置と比較したいため、結論 (2) に基づいて、一致するように not
を追加します。文字を前面に置くことができます。
高洛峰2017-04-17 17:49:14
重要な点は、donghui
が言ったように、FALSE(x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)
に基づいてソートされ、falseが最初にランク付けされ、trueが最後にランク付けされます。それらは同じです。次を参照してください。ソートは最終的にソートが必要な要素を返します。
テストコードは次のとおりです: (dokelung
と donghui
より)
実行して入力を表示し、パターンを発見します。
出力: