2

の:

結果を小文字にせずに、大文字と小文字を区別しないリストの並べ替え?

私は2つの解決策を見てきました:(入力がutf-8文字列のリストであると仮定しましょう、例えば['z1', 'A1', 'a0', 'bC']

  • ラムダなし:L.sort(key = str.lower);
  • ラムダの場合:L.sort(key = lambda s: s.lower());

違いは何ですか?どちらが優れているか、より「pythonic」ですか?

(私が質問にタグを付けたように、についてpython-3.xです。python 2 に固有の動作に関連するすべてのコメントを歓迎しますが、注意してください)

4

2 に答える 2

4

str.lowerstrタイプのバインドされていないメソッドでありlambda s: s.lower()、無名関数です。最終的な効果は同じです: の各要素に対してLkey呼び出し可能オブジェクトが呼び出され、要素が渡されます。

文字列を並べ替えていない場合、効果は異なる可能性がありますメソッドは文字列でのみ機能しますが、匿名ラムダ関数はメソッドstr.lowerを持つものすべてで機能します。たとえば、と.lower()が混在している場合に使用します。bytesstr

私は最初のバージョンの方が好きです。短くて少し速いです。さらに、値が文字列でない場合はエラーがスローされます。これは通常、必要なものです。

于 2012-10-16T19:34:09.387 に答える
2

3 番目のオプションは、モジュールmethodcallerからのものです。operator

from operator import methodcaller
L.sort(key=methodcaller('lower'))

それが行うことはオプションと同等lambdaですが、好みに応じて、素晴らしく読みやすく、オペレーターモジュールからのものであり、かなり気の利いたものです。str.lowerオブジェクトが文字列の場合 (およびその逆) は壊れますunicode

于 2012-10-16T20:01:14.153 に答える