文字列のリストを並べ替える方法は?


417

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


1
locale現在のロケールに従って自然にソートするには、文字列照合メソッドを使用します。
u0b34a0f6ae 2009

回答:


519

基本的な答え:

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)

37
mylist.sort(key=str.lower)より速いです。
JFS

1
いい視点ね。初心者にとっては何が起こっているのかを簡単に確認できるので、現在の例はそのままにしておきますが、将来はそれを覚えておきます。
Eli Courtwright、2008年

1
好奇心が強い方は、list.sort()のパフォーマンスをここ
Hari Ganesan 14

1
@BornToCode:1- わかっています。私のコメントが返信するリビジョン(2008)を見てください(私のコメントはラムダの不必要な使用についてです)。2-非ASCII文字のソートは、別の大きなトピックです。ロケールベースのソリューションの代わりにPyICUを使用できます
jfs

1
@Dmitryこれは、で呼び出されたソート関数の戻り値を出力するためです[1, 2, 3].sort()sort()所定の位置にリストをソートする(すなわち、直接リストを変更し)、それはソートされたリストを返しません。また、実際にあなたのprint文を印刷して、何も返しませんNone。あなたが変数にあなたのリストを保存した場合、たとえばx、呼ばれるx.sort()、そしてprint(x)、あなたはソートされたリストを見るでしょう。
bjg222 2017

56

sorted()関数にも注目してください。

for x in sorted(list):
    print x

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



18

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

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のみのコンテキストで正常に動作します。



10

しかし、これは言語固有の並べ替えルールをどのように処理しますか?ロケールを考慮していますか?

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


1

古い質問ですが、設定なしでロケール対応のソート を実行したい場合は、この回答で提案さlocale.LC_ALLれているPyICUライブラリを使用して実行できます。

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

次に、例:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

これは、ロケールをインストールしたり、他のシステム設定を変更したりすることなく機能しました。

(これは上記のコメントですでに提案されてましたが、最初は自分で見逃していたため、もっと目立つようにしたかったのです。)


0

と思います s = "ZWzaAd"

文字列の上で並べ替えるには、単純なソリューションは1つ下になります。

print ''.join(sorted(s))

これは、ここでソートしている文字列のリストではありません
mnl 2018

0

または多分:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

結果

['abc'、 'ba'、 'cd'、 'dc'、 'xy']


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'

ソートされた(スコア)のxのスコア= score.split( '、'):print(x)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.