458

Pythonでアルファベット順にソートされたリストを作成する最良の方法は何ですか?

4

11 に答える 11

556

基本的な答え:

mylist = ["b", "C", "A"]
mylist.sort()

これにより、元のリストが変更されます(つまり、インプレースでソートされます)。元のリストを変更せずにリストのソートされたコピーを取得するには、次のsorted()関数を使用します。

for x in sorted(mylist):
    print x

ただし、上記の例はロケールを考慮しておらず、大文字と小文字を区別して並べ替えを実行するため、少し単純です。オプションのパラメーターkeyを利用して、カスタムの並べ替え順序を指定できます(代わりに、を使用するcmpと、複数回評価する必要があるため、非推奨のソリューションになりますkey。要素ごとに1回だけ計算されます)。

したがって、現在のロケールに従ってソートするには、言語固有のルールを考慮に入れます(cmp_to_keyfunctoolsのヘルパー関数です)。

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)
于 2008-08-30T17:10:12.687 に答える
60

sorted()次の関数も注目に値します。

for x in sorted(list):
    print x

これは、元のリストを変更せずに、並べ替えられた新しいバージョンのリストを返します。

于 2008-08-30T22:14:36.557 に答える
40
list.sort()

それは本当に簡単です:)

于 2008-08-30T17:04:40.093 に答える
19

文字列をソートする適切な方法は次のとおりです。

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 のみのコンテキストでうまく機能します。

于 2009-10-28T22:45:59.960 に答える
10

しかし、これは言語固有のソート規則をどのように処理するのでしょうか? ロケールは考慮されますか?

いいえ、list.sort()一般的な並べ替え機能です。Unicode ルールに従って並べ替えたい場合は、カスタムの並べ替えキー関数を定義する必要があります。pyucaモジュールを試してみることもできますが、完成度はわかりません。

于 2008-08-30T18:10:45.193 に答える
0

仮定するs = "ZWzaAd"

文字列の上でソートするには、単純な解決策は1の下になります。

print ''.join(sorted(s))
于 2017-05-12T06:16:39.257 に答える
0

簡単です: 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)

于 2020-06-03T02:16:29.163 に答える