Pythonでアルファベット順にソートされたリストを作成する最良の方法は何ですか?
11 に答える
基本的な答え:
mylist = ["b", "C", "A"]
mylist.sort()
これにより、元のリストが変更されます(つまり、インプレースでソートされます)。元のリストを変更せずにリストのソートされたコピーを取得するには、次のsorted()
関数を使用します。
for x in sorted(mylist):
print x
ただし、上記の例はロケールを考慮しておらず、大文字と小文字を区別して並べ替えを実行するため、少し単純です。オプションのパラメーターkey
を利用して、カスタムの並べ替え順序を指定できます(代わりに、を使用するcmp
と、複数回評価する必要があるため、非推奨のソリューションになりますkey
。要素ごとに1回だけ計算されます)。
したがって、現在のロケールに従ってソートするには、言語固有のルールを考慮に入れます(cmp_to_key
functoolsのヘルパー関数です)。
sorted(mylist, key=cmp_to_key(locale.strcoll))
最後に、必要に応じて、並べ替え用のカスタムロケールを指定できます。
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']
最後の注意:メソッドを使用する大文字と小文字を区別しないソートの例が表示されます。lower()
これらは文字のASCIIサブセットに対してのみ機能するため、正しくありません。英語以外のデータでは、これら2つは間違っています。
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
list.sort()
それは本当に簡単です:)
文字列をソートする適切な方法は次のとおりです。
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']
# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']
の前の例はmylist.sort(key=lambda x: x.lower())
、ASCII のみのコンテキストでうまく機能します。
しかし、これは言語固有のソート規則をどのように処理するのでしょうか? ロケールは考慮されますか?
いいえ、list.sort()
一般的な並べ替え機能です。Unicode ルールに従って並べ替えたい場合は、カスタムの並べ替えキー関数を定義する必要があります。pyucaモジュールを試してみることもできますが、完成度はわかりません。
仮定するs = "ZWzaAd"
文字列の上でソートするには、単純な解決策は1の下になります。
print ''.join(sorted(s))
簡単です: https://trinket.io/library/trinkets/5db81676e4
scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'
スコア = スコア.スプリット(',') for x in sorted(scores): print(x)