Pythonのsortメソッドとsorted関数の使い方の詳しい解説

Pythonには、オブジェクトの要素をソートするために、sortメソッドとsorted関数という二つが用意されています。メソッドは既存のリストの要素を並び替えるもので、これはリストに対してしか使えません。sorted関数はリスト以外にも、タプル、辞書、集合に使うことができます。これは、元のオブジェクトの要素を並び替えた新しいリストを作ります。

ここでは、それぞれの詳しい使い方を解説していきます。

目次

1. Pythonのsortメソッドの使い方

Pythonのsortメソッドはリストの要素の並び順を様々な方法でソート(並び替え)するものです。これはリストメソッドのため、リスト以外には使うことはできません。リストと似ているタプルにも使えませんので注意しましょう。

タプルやdict(辞書)の要素の並び替えにはsorted関数を、numpyのarray配列の並び替えにはnp.sort関数を使います。これらに関しても後述します。

それでは、まずsortメソッドから見ていきましょう。sortメソッドの書き方は次の通りです。

In [ ]:
''' sortメソッドの使い方 '''

#  基本(昇順でソート)
リスト.sort()

#  降順でソート
リスト.sort(reverse=True)

#  長さ順でソート
リスト.sort(key=len)

#  大文字小文字の区別なくソート
リスト.sort(key=str.lower)

#  組み合わせ
リスト.sort(key=len, reverse=True)
リスト.sort(key=str.lower, reverse=True)

sortメソッドは新しいリストを作るのではなく元のリストの要素を並び替えます。これが、「Pythonのappendメソッド」と同じようにsortメソッドがイミュータブルなオブジェクトであるタプルでは使えない理由です。

上記のように、sort()の括弧の中の引数に何も書かない場合は昇順で並び替えます。

そして、’reverse=True’と書くと降順で並び替えます。’key=’で並び替えのオプションを書くことができます。

‘key=’の右項に関数名を書くことで、様々なやり方で並び替えることができます。よく使うのは、アルファベットの大文字小文字を一緒に並び替える’key=str.lower’とリスト内の文字列を文字数順で並び替える’key=len’でしょう。これについても実例を見ながら解説します。

それでは、まずはsortメソッドのもっとも基本的な使い方を見ていきましょう。

1.1. Pythonのlistをsortメソッドで並び替える

早速、以下のコードをご覧ください。いずれも、sortメソッドの引数(括弧()の中)に何も書いていない場合の並び替えです。

In [1]:
''' 数値を昇順でソートします。 '''
numlist = [3, 5, 4, 1, 2]
numlist.sort()
print(numlist)

''' 文字を昇順でソートします。 '''
#  日本語はあいうえお順でソート
str_list1 = ['えび', 'うり', 'いんげんまめ', 'おくら',  'あんぱん']
str_list1.sort()
print(str_list1)

#  ひらがなとカタカタはひらがなからソート
str_list2 = ['エビ', 'うり', 'いんげんまめ', 'おくら',  'アンパン']
str_list2.sort()
print(str_list2)

#  ひらがなとカタカタと漢字は?
str_list3 = ['エビ', 'うり', '隠元豆', 'おくら',  'アンパン']
str_list3.sort()
print(str_list3)

#  英語はアルファベット順でソート
str_list4 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
str_list4.sort()
print(str_list4)

#  アルファベットの大文字と小文字は大文字からソート
str_list5 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
str_list5.sort()
print(str_list5)

#  ひらがなとカタカタと漢字とアルファベットは?
str_list6 =  ['apple', 'Banana', 'cabbage', '瓜', 'いんげんまめ', 'あんぱん']
str_list6.sort()
print(str_list6)
[1, 2, 3, 4, 5]
['あんぱん', 'いんげんまめ', 'うり', 'えび', 'おくら']
['いんげんまめ', 'うり', 'おくら', 'アンパン', 'エビ']
['うり', 'おくら', 'アンパン', 'エビ', '隠元豆']
['apple', 'banana', 'cabbage', 'dish', 'egg']
['Cabbage', 'Egg', 'apple', 'banana', 'dish']
['Banana', 'apple', 'cabbage', 'あんぱん', 'いんげんまめ', '瓜']

ここで確認しておきたいことは2つあります。

まずは、sortメソッドはリストの要素を並び替えた新しいリストを作るのではなく、元のリストの要素を並び替えるということです。この点はしっかりと覚えておきましょう。

次に、sortメソッドの引数を空白にした場合の並び替えの法則をおさえておきましょう。具体的には次のような法則になっています。

  • 数値は昇順で並び替える
  • ひらがなやカタカナはあいうえお順、アイウエオ順で並び替える
  • ひらがなとカタカナがある場合、先にひらがなのあいうえお順、次にカタカナのアイウエオ順で並び替える
  • ひらがなとカタカナと漢字がある場合、まずひらがなのあいうえお順、次にカタカナのアイウエオ順、最後に漢字の順で並び替える
  • 英字はアルファベット順で並び替える
  • 大文字と小文字の英字がある場合、先に大文字の英字のアルファベット順、次に小文字の英字のアルファベット順で並び替える

なお、次の例のように数値と文字列が混在しているリストでは、sortメソッドを使うことはできません。

In [3]:
''' 数値と文字列が混同しているリストはソートできません '''
mixed_list =  ['e', 'a', 'd', 'b', 'c', 'え', 'う', 'い', 'お',  'あ', 3, 5, 4, 1, 2]
mixet_list.sort()
print(mixed_list)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-53-195a1f055ffa> in <module>
      1 ''' 数値と文字列が混同しているリストはソートできません '''
      2 mixed_list =  ['e', 'a', 'd', 'b', 'c', 'え', 'う', 'い', 'お',  'あ', 3, 5, 4, 1, 2]
----> 3 mixet_list.sort()
      4 print(mixed_list)

NameError: name 'mixet_list' is not defined

これも合わせて確認しておきましょう。

1.2. Pythonのsortにreverse=Trueと書くと降順で並び替える

Pythonのsort()の引数に’reverse=True’と書くと、降順(厳密には空白の場合と真逆の法則)で並び替えます。

次のコードで確認しましょう。

In [4]:
''' 数値を降順でソートします。 '''
numlist = [3, 5, 4, 1, 2]
numlist.sort(reverse=True)
print(numlist)

''' 文字を降順でソートします。 '''
#  日本語はあいうえお降順順でソート
str_list1 = ['えび', 'うり', 'いんげんまめ', 'おくら',  'あんぱん']
str_list1.sort(reverse=True)
print(str_list1)

#  ひらがなとカタカタはカタカナからソート
str_list2 = ['エビ', 'うり', 'いんげんまめ', 'おくら',  'アンパン']
str_list2.sort(reverse=True)
print(str_list2)

#  ひらがなとカタカタと漢字は、漢字から
str_list3 = ['エビ', 'うり', '隠元豆', 'おくら',  'アンパン']
str_list3.sort(reverse=True)
print(str_list3)

#  英語はアルファベット降順でソート
str_list4 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
str_list4.sort(reverse=True)
print(str_list4)

#  アルファベットの大文字と小文字は小文字からソート
str_list5 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
str_list5.sort(reverse=True)
print(str_list5)

#  ひらがなとカタカタと漢字とアルファベットは?
str_list6 =  ['apple', 'Banana', 'cabbage', '瓜', 'いんげんまめ', 'あんぱん']
str_list6.sort(reverse=True)
print(str_list6)
[5, 4, 3, 2, 1]
['おくら', 'えび', 'うり', 'いんげんまめ', 'あんぱん']
['エビ', 'アンパン', 'おくら', 'うり', 'いんげんまめ']
['隠元豆', 'エビ', 'アンパン', 'おくら', 'うり']
['egg', 'dish', 'cabbage', 'banana', 'apple']
['dish', 'banana', 'apple', 'Egg', 'Cabbage']
['瓜', 'いんげんまめ', 'あんぱん', 'cabbage', 'apple', 'Banana']

空白の場合と全く逆順で並び替えられていることをしっかりと確認しておきましょう。

1.3. Pythonのsortにkey=lenと書くと文字数順で並び替える

続いて、sort()の引数に’key=len’と書くと文字列の長さが少ないものから昇順で並び替えてくれます。次のコードで確認しましょう。

In [5]:
'''  長さ順昇順でソート '''

#  文字の長さ順でソート
list1 = ['あ', 'いい', 'ううう', 'ええええ',  'おおおおお']
list1.sort(key=len)
print(list1)

#  ひらがなとカタカタと漢字関係なく長さ順でソートします。
list2 = ['ア', 'いい', 'うウう', 'ええええ',  'おオおオお']
list2.sort(key=len)
print(list2)

#  アルファベット長さ順
list3 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
list3.sort(key=len)
print(list3)

#  アルファベットも日本語も関係なく長さ順になります。
list4 = ['ア', 'いい', 'egg', 'apple', 'dish', 'banana', 'cabbage']
list4.sort(key=len)
print(list4)
['あ', 'いい', 'ううう', 'ええええ', 'おおおおお']
['ア', 'いい', 'うウう', 'ええええ', 'おオおオお']
['egg', 'dish', 'apple', 'banana', 'cabbage']
['ア', 'いい', 'egg', 'dish', 'apple', 'banana', 'cabbage']

全て、文字列の長さ順で並び替えられていますね。厳密には文字の数で並び替えられるため、ひらがな、カタカナ、漢字、アルファベットの違いによって、どれかが優先されるということはありません。

参考に次のコードをご覧ください。

In [1]:
''' ひらがな、カタカナ、アルファベットで文字数が同じ場合は変化はありません '''
list = ['ア', 'a', 'あ']
list.sort(key=len)
print(list)
['ア', 'a', 'あ']

文字の数が同じ場合は、アルファベット、ひらがな、カタカナの順で並び替えるということもありませんので勘違いのないように注意しましょう。

なお、以下のように、数値のリストに対しては’key=len’を使うことはできません。

In [6]:
''' 数値は長さ順指定はできません。 '''
num_list = [3, 504, 4014, 10, 2021]
num_list.sort(key=len)
print(num_list)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-a6a77d0e3289> in <module>
      1 ''' 数値は長さ順指定はできません。 '''
      2 num_list = [3, 504, 4014, 10, 2021]
----> 3 num_list.sort(key=len)
      4 print(num_list)

TypeError: object of type 'int' has no len()

これができないのは、そもそも数値オブジェクトにはlen関数が使えないからです。そもそも数値はもともと昇順、降順で並び替えられるので不要なのですが、後で’key=’について解説する前段階として、ここで伝えておきます。

1.4. key=lenとreverse=True一緒で文字数降順で並び替える

引数に、key=lenとreverse=Trueを同時に書くと、文字数の多いものから降順で並び替えます。次のコードで確認しましょう。

In [7]:
''' 長さ降順でソート '''
#  長さ降順でソート
list1 = ['あ', 'いい', 'ううう', 'ええええ',  'おおおおお']
list1.sort(key=len, reverse=True)
print(list1)

#  ひらがなとカタカタと漢字の関係も逆に。
list2 = ['ア', 'いい', 'うウう', 'ええええ',  'おオおオお']
list2.sort(key=len, reverse=True)
print(list2)

#  アルファベットを長さ降順でソート。
list3 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
list3.sort(key=len, reverse=True)
print(list3)

#  アルファベットも日本語も関係なく長さ降順になります。
list4 = ['ア', 'いい', 'egg', 'apple', 'dish', 'banana', 'cabbage']
list4.sort(key=len, reverse=True)
print(list4)
['おおおおお', 'ええええ', 'ううう', 'いい', 'あ']
['おオおオお', 'ええええ', 'うウう', 'いい', 'ア']
['cabbage', 'banana', 'apple', 'dish', 'egg']
['cabbage', 'banana', 'apple', 'dish', 'egg', 'いい', 'ア']

注意点は、key=lenのみの場合と全く同じです。

1.5. key=str.lowerと書くと大文字小文字区別なく並び替える

英字を大文字小文字の区別なく並び替えたい場合は、key=str.lowerと書きます。

In [8]:
''' アルファベットを大文字小文字の区別なくソート '''
list1 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
list1.sort(key=str.lower)
print(list1)

''' アルファベットを大文字小文字の区別なく降順でソート '''
list2 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
list2.sort(key=str.lower, reverse=True)
print(list2)
['apple', 'banana', 'Cabbage', 'dish', 'Egg']
['Egg', 'dish', 'Cabbage', 'banana', 'apple']

1.6. 【中級】並び替えの法則を自分で作る

ここではsortメソッドの並び替え法則は自分で作ることができるということをお伝えします。これはPythonの中級以上の解説になるため、最初は読み飛ばして頂いて構いませんが、こうしたことができるということは頭に入れておきましょう。

先ほど’key=len’のところで少し触れましたが、実はsortメソッドの’key=’は、関数の機能を呼び出しているものです。

例えば、len関数は、次のように関数に渡した文字列の文字数を返してくれますね。

In [1]:
print(len('あ'))
print(len('aa'))
print(len('アアア'))
1
2
3

sortメソッドにkey=関数名と書くと、sortメソッドがまず文字列に対して指定の関数を使用して、その結果によって並び替えるという処理を行なっているのです。つまり’key=len’と書くと、リスト内の文字列要素をまず文字数に変換して、sortメソッドはその文字数を数値で受け取って、その受け取った数値によって並び替えているのです。

‘key=str.lower’も全く同じです。これを書くと、リスト内の文字列要素を一度全て小文字に変換して、sortメソッドはそれを受け取って、アルファベット順で並び替えています。

これはつまり、自分で関数を作ると、sortメソッドの並び替えの独自の法則を作ることができるということです。関数については『Pythonのdef文を使った関数の作り方まとめ』と『Pythonのlambda(ラムダ式)の書き方まとめ』で確認頂くとして、ここでは簡単なやり方を書いておきます。

それでは以下のコードをご覧ください。このコードでは、sortsecondという関数を作っています。この関数は、関数に渡されたデータのインデックス番号1番の値を読み込むというものです。

これをsortメソッドのkeyに指定すると、与えた要素の後ろ側の数字を基準にして並び替えています。

In [9]:
''' ソートの条件を自分で作ることもできます。 '''

# ソート条件を関数で作る
def sortsecond(val):
    return val[1]

#  条件を指定せずソート
list = [(1, 2), (3, 3), (2, 1)]
list.sort()
print(list)


#  条件を指定してソート
list.sort(key=sortsecond)
print(list)
[(1, 2), (2, 1), (3, 3)]
[(2, 1), (1, 2), (3, 3)]

関数はラムダ式で書いても構いません。

In [10]:
''' ソートの条件はlambda式でも大丈夫です。 '''

# ソート条件をlambda式で作る
sortsecond = lambda val: val[1]

#  条件を指定せずソート
list = [(1, 2), (3, 3), (2, 1)]
list.sort()
print(list)


#  条件を指定してソート
list.sort(key=sortsecond)
print(list)
[(1, 2), (2, 1), (3, 3)]
[(2, 1), (1, 2), (3, 3)]

これも便利なので覚えておきましょう。

2. Pythonのsorted関数の使い方

さて、Pythonにはsortメソッド以外にもsorted関数というものがあります。これを使うと、リストだけでなくtuple(タプル)とdict(辞書)の要素も並び替えることができるようになります。

sortメソッドは元のリストの要素を並び替えていましたが、sorted関数は要素を並び替えた新しいリストを作るという点です。

使い方はsortメソッドとほとんど同じです。以下が基本書式です。

In [ ]:
''' sorted関数の書き方 '''
sorted(リストor辞書, key=, reverse=)

sorted関数は関数なのでリストやタプル、辞書を関数の第一引数として渡します。並び替えの法則を変えたい場合は’key=関数名’、降順で並び替えたい場合はreverse=Trueと書くのは同じです。ただし、sorted関数では、それは第二引数、第三引数で渡します。

それでは実際に見ていきましょう。なお、sorted関数はリストに使う場合とタプルに使う場合は全く同じなので、ここではリストを例に解説します。

2.1. Pythonのlistをsorted関数で並び替え

早速、次のコードをご覧ください。

In [1]:
''' sorted関数は要素を並び替えた新しいリストを作る。 '''
list = [4, 3, 5, 1, 2]
new_list = sorted(list)  #  sorted関数は要素を並び替えた新しいリストを作ります。
print(new_list)
print(list)  #  元のリストに変化はありません。
[1, 2, 3, 4, 5]
[4, 3, 5, 1, 2]

sortメソッドと違って、要素を並び替えた別の新しいリストを作っていることがわかると思います。’key=’やreverse=”を指定しない場合の並び替えの法則はsortメソッドと全く同じです。

In [1]:
''' 並び替えの法則はsortメソッドと同じです。 '''

#  あいうえお順
list1 = ['えび', 'うり', 'いんげんまめ', 'おくら',  'あんぱん']
new_list1 = sorted(list1)
print(new_list1)  #並び替えた後のリスト
print(list1)  #元のリストに変化はありません

#  アルファベット順でソート
list2 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
new_list2 = sorted(list2)
print(new_list2)  #  並び替えた後のリスト
print(list2)  #  元のリストに変化はありません

#  大文字と小文字は大文字からソート
list3 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
new_list3 = sorted(list3)
print(new_list3)  #  並び替えた後のリスト
print(list3)  #  元のリストに変化はありません
['あんぱん', 'いんげんまめ', 'うり', 'えび', 'おくら']
['えび', 'うり', 'いんげんまめ', 'おくら', 'あんぱん']
['apple', 'banana', 'cabbage', 'dish', 'egg']
['egg', 'apple', 'dish', 'banana', 'cabbage']
['Cabbage', 'Egg', 'apple', 'banana', 'dish']
['Egg', 'apple', 'dish', 'banana', 'Cabbage']

次に、第二引数に’reveser=True’と書くと、降順で並び替えられます。次のコードをご覧ください。

In [1]:
'''降順で並び替えてみましょう。 '''

#  数値を降順でソートします。
numlist = [3, 5, 4, 1, 2]
new_numlist = sorted(numlist, reverse=True)
print(new_numlist)

#  日本語はあいうえお降順順でソート
list1 = ['えび', 'うり', 'いんげんまめ', 'おくら',  'あんぱん']
new_list1 = sorted(list1, reverse=True)
print(new_list1)

#  ひらがなとカタカタはカタカナからソート
list2 = ['エビ', 'うり', 'いんげんまめ', 'おくら',  'アンパン']
new_list2 = sorted(list2, reverse=True)
print(new_list2)

#  ひらがなとカタカタと漢字は、漢字から
list3 = ['エビ', 'うり', '隠元豆', 'おくら',  'アンパン']
new_list3 = sorted(list3, reverse=True)
print(new_list3)

#  英語はアルファベット降順でソート
list4 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
new_list4 = sorted(list4, reverse=True)
print(new_list4)

#  アルファベットの大文字と小文字は小文字からソート
list5 = ['Egg', 'apple', 'dish', 'banana', 'Cabbage']
new_list5 = sorted(list5, reverse=True)
print(new_list5)
[5, 4, 3, 2, 1]
['おくら', 'えび', 'うり', 'いんげんまめ', 'あんぱん']
['エビ', 'アンパン', 'おくら', 'うり', 'いんげんまめ']
['隠元豆', 'エビ', 'アンパン', 'おくら', 'うり']
['egg', 'dish', 'cabbage', 'banana', 'apple']
['dish', 'banana', 'apple', 'Egg', 'Cabbage']

並び替えの法則を変えて、文字数の長さ順で並び替えるにはKey=’len’と書きます。以下でご覧ください。

In [1]:
'''  長さ順昇順でソート '''

#  文字の長さ順でソート
slist1 = ['あ', 'いい', 'ううう', 'ええええ',  'おおおおお']
new_slist1 = sorted(slist1, key=len)
print(new_slist1)

#  ひらがなとカタカタと漢字関係なく長さ順でソートします。
slist2 = ['ア', 'いい', 'うウう', 'ええええ',  'おオおオお']
new_slist2 = sorted(slist2, key=len)
print(new_slist2)

#  アルファベット長さ順
slist3 = ['egg', 'apple', 'dish', 'banana', 'cabbage']
new_slist3 = sorted(slist3, key=len)
print(new_slist3)

#  アルファベットも日本語も関係なく長さ順になります。
slist4 = ['ア', 'いい', 'egg', 'apple', 'dish', 'banana', 'cabbage']
new_slist4 = sorted(slist4, key=len)
print(new_slist4)
['あ', 'いい', 'ううう', 'ええええ', 'おおおおお']
['ア', 'いい', 'うウう', 'ええええ', 'おオおオお']
['egg', 'dish', 'apple', 'banana', 'cabbage']
['ア', 'いい', 'egg', 'dish', 'apple', 'banana', 'cabbage']

もちろんsortメソッドと同じくkey=”とreverse=”を同時に指定することができます。

In [1]:
''' 長さ降順でソート '''

#  長さ降順でソート
lista = ['あ', 'いい', 'ううう', 'ええええ',  'おおおおお']
new_lista = sorted(lista, key=len, reverse=True)
print(new_lista)

#  ひらがなとカタカタと漢字の関係も逆に。
listb = ['ア', 'いい', 'うウう', 'ええええ',  'おオおオお']
new_listb = sorted(listb, key=len, reverse=True)
print(new_listb)

#  アルファベットを長さ降順でソート。
listc = ['egg', 'apple', 'dish', 'banana', 'cabbage']
new_listc = sorted(listc, key=len, reverse=True)
print(new_listc)

#  アルファベットも日本語も関係なく長さ降順になります。
listd = ['ア', 'いい', 'egg', 'apple', 'dish', 'banana', 'cabbage']
new_listd = sorted(listd, key=len, reverse=True)
print(new_listd)
['おおおおお', 'ええええ', 'ううう', 'いい', 'あ']
['おオおオお', 'ええええ', 'うウう', 'いい', 'ア']
['cabbage', 'banana', 'apple', 'dish', 'egg']
['cabbage', 'banana', 'apple', 'dish', 'egg', 'いい', 'ア']

自分で作った関数で、独自の並び替え法則を適用する場合も同じです。

In [1]:
''' 並び替えの法則を自分で作る '''

# ソート条件をlambda式で作る
sortsecond = lambda val: val[1]

#  条件を指定せずソート
list = [(1, 2), (3, 3), (2, 1)]
print(list)

#  条件を指定してソート
new_list = sorted(list, key=sortsecond)
print(new_list)
[(1, 2), (3, 3), (2, 1)]
[(2, 1), (1, 2), (3, 3)]

いかがでしょうか。駆け足で説明しましたが、並び替えの法則や応用の方法等は、sortメソッドと全く同じですので、sortメソッドをしっかり覚えれば、難しいところはあまりないと思います。

2.2. Pythonのdictをsorted関数で並び替え

Pythonのsorted関数はdict(辞書)にも使うことができます。並び替えのルールや、オプション引数の’key=’や’reverse=’の書き方は、sortメソッドと全く同じなので、ここでは異なる点だけ解説します。

dictにsorted関数を使う上で気をつけたいのは以下の点です。

  • dictにsorted関数を使うと要素が並び替えられたものがリストで戻ってくる。
  • デフォルト(keyとreverseを書かない状態)ではdictのキーのみが並び替えてリスト化される。
  • 値を並び替えてリスト化するにはdictのvalueメソッドと組み合わせる。
  • キーと値の両方を並び替えてリスト化するにはdictのitemメソッドと組み合わせる。

それでは、早速実際に見てみましょう。なお、これについては『Pythonのdict(辞書)をsortする方法まとめ』でも解説しているので、ぜひ併せてご確認ください。

2.2.1. Pythonのsortedでdictのキーを並び替えてリスト化

辞書にsorted関数を使うと、デフォルトではキーのみが並び替えられます。並び替えの法則はsortメソッドと同じです。

次のコードをご覧ください。

In [1]:
''' 2つの辞書を作ります。 '''
dict1 = {3:"orange",  2:"red", 5:"white", 1:"blue", 4:"yellow", }
dict2 = {"yellow":4, "blue":1,  "orange":3, "white":5, "red":2}
 
''' sorted()関数を使うとキーがソートされます。'''
sorted_keys1 = sorted(dict1)
print(sorted_keys1)   #  数値の場合は昇順にソートされます。

sorted_keys2 = sorted(dict2)
print(sorted_keys2)  #  英字文字列はアルファベット順にソートされます。 
[1, 2, 3, 4, 5]
['blue', 'orange', 'red', 'white', 'yellow']

辞書のキーだけが取り出されて並び替えられていますね。また、リスト化されていることにもご注目ください。

第二引数にreverse=Trueと書くと辞書のキーが降順で並び替えられてリスト化されます。

In [2]:
''' 第二引数にreverse=Trueと書くと降順'''
reverse_keys1 = sorted(dict1, reverse=True)
reverse_keys2 = sorted(dict2, reverse=True)
print(reverse_keys1)
print(reverse_keys2)
[5, 4, 3, 2, 1]
['yellow', 'white', 'red', 'orange', 'blue']

簡単ですね。

2.2.2. Pythonのsortedとvalueでdictの値を並び替えてリスト化

辞書のキーではなく、値を並び替えてリスト化したい場合は、sorted関数とvalueメソッドを組み合わせます。以下のコードをご覧ください。

In [1]:
'''2つの辞書を作ります。'''
dict1 = {3:"orange",  2:"red", 5:"white", 1:"blue", 4:"yellow", }
dict2 = {"yellow":4, "blue":1,  "orange":3, "white":5, "red":2}
 
'''sorted()関数の第二引数に「reverse = True」と書きます。'''
sorted_values1 = sorted(dict1.values())
print(sorted_values1) #キーが数字順にソートされます。

sorted_values2 = sorted(dict2.values())
print(sorted_values2) #キーがアルファベット順にソートされます。
['blue', 'orange', 'red', 'white', 'yellow']
[1, 2, 3, 4, 5]

今度は、辞書の値のみが並び替えられて、リスト化していることが分かりますね。これも降順で並び替えるには、第二引数にreverse=Trueと書きます。

In [2]:
'''降順にソートするには、dict()関数の第二引数に「reverse = True」と書きます。'''
reverse_values1 = sorted(dict1.values(), reverse = True)
print(reverse_values1) 
reverse_values2 = sorted(dict2.values(), reverse = True)
print(reverse_values2)
['yellow', 'white', 'red', 'orange', 'blue']
[5, 4, 3, 2, 1]

辞書のvalueメソッドと組み合わせるということを忘れないようにしましょう。

2.2.3. Pythonのsortedとitemsでdictのキーと値を並び替えてリスト化

辞書のキーと値を一緒に並び替えてリスト化したい場合は辞書のitemsメソッドと組み合わせます。この場合、キーが基準として並び替えが行われ、そこに値がついてきます。

実際に見てみましょう。

In [1]:
'''2つの辞書を作ります。'''
dict1 = {3:"orange",  2:"red", 5:"white", 1:"blue", 4:"yellow", }
dict2 = {"yellow":4, "blue":1,  "orange":3, "white":5, "red":2}
 
'''items()メソッドと組み合わせるとキーと値がソートされます。'''
sorted_dict1 = sorted(dict1.items())
print(sorted_dict1) #キーが数字順にソートされます。

sorted_dict2 = sorted(dict2.items())
print(sorted_dict2) #キーがアルファベット順にソートされます。
[(1, 'blue'), (2, 'red'), (3, 'orange'), (4, 'yellow'), (5, 'white')]
[('blue', 1), ('orange', 3), ('red', 2), ('white', 5), ('yellow', 4)]

キーが基準になって並び替えが行われた上で、辞書のキーと値が一緒にリスト化されていることをご確認ください。なお、これにdict関数を使うと、以下のように辞書に変換することができます。

In [2]:
new_dict1 = dict(sorted_dict1)
print(new_dict1)
new_dict2 = dict(sorted_dict2)
print(new_dict2)
{5: 'white', 4: 'yellow', 3: 'orange', 2: 'red', 1: 'blue'}
{'yellow': 4, 'white': 5, 'red': 2, 'orange': 3, 'blue': 1}

sorted関数の第二引数にreverse=Trueを加えてみましょう。

In [3]:
''' 降順にするにはsorted()関数の第二引数に「reverse = True」と書きます。'''
sorted_dict1 = sorted(dict1.items(), reverse = True)
print(sorted_dict1) #キーが数字順にソートされます。

sorted_dict2 = sorted(dict2.items(), reverse = True)
print(sorted_dict2) #キーがアルファベット順にソートされます。
[(5, 'white'), (4, 'yellow'), (3, 'orange'), (2, 'red'), (1, 'blue')]
[('yellow', 4), ('white', 5), ('red', 2), ('orange', 3), ('blue', 1)]

降順になりましたね。

今回、key=の指定を行いませんでしたが、辞書の場合もリストやタプルと同じようにkey=を指定することができます。その時は、キーを基準に並び変えるのか、valueメソッドと併用して値を基準に並び変えるのか、itemsメソッドと併用してキーを基準にして両方を並び変えるのか、をしっかりチェックしましょう。

2.3. Pythonのsetをsorted関数で並び替え

あまり使わないと思いますが、Pythonのset(集合)もsorted関数で並び替えてリストにすることができます。並び替えの法則や方法は、リストやタプルと全く同じです。

次のコードで確認しておきましょう。

In [1]:
''' Pythonのsetにsorted関数を使う '''
set = {'apple', 'Blueberry', 'Cinnamon'}

#  setの要素を並び替えてリスト化
ordered_set = sorted(set)
print(ordered_set)
#  逆順に並び替えてリスト化
reversed_set = sorted(set, reverse=True)
print(reversed_set)
#  大文字小文字の区別なく並び替えてリスト化
lowercapital_set = sorted(set, key=str.lower )
print(lowercapital_set)
['Blueberry', 'Cinnamon', 'apple']
['apple', 'Cinnamon', 'Blueberry']
['apple', 'Blueberry', 'Cinnamon']

なお、sorted関数はsetの要素を並び替えてリスト化しますが、順不同でリスト化したい場合はlist関数を使います。

In [1]:
''' setの要素を並び変えずにリストにするにはlist関数を使います。 '''
set = {'apple', 'Blueberry', 'Cinnamon'}
set_list = list(set)
print(set_list)
['apple', 'Cinnamon', 'Blueberry']

リストに対してset関数を使うと、setに戻すことができます。

In [1]:
''' リストをsetにするにはset関数を使います。 '''

list = ['apple', 'Blueberry', 'Cinnamon']
set_new = set(list)
print(set_new)
{'Cinnamon', 'Blueberry', 'apple'}

3. PythonのNumpyのarrayのnp.sort

最後に、Pythonのnumpyのarray(配列)の並び替えについても触れておきます。numpyのarrayの並び替えには、numpyライブラリのsort関数、sortメソッドを使います。

関数は要素を並び替えた新しいarrayを作り、メソッドは既存のarrayを並び替えます。以下のarrayを例に見てみましょう。なお、arrayの並び替えには様々な方法があるので、ここでは簡潔な説明に留めておきます。

In [1]:
import numpy as np
array = np.array([[20, 3, 100], [1, 200, 30], [300, 10, 2]])
print(array)
[[ 20   3 100]
 [  1 200  30]
 [300  10   2]]

3.1. PythonのNumpyのarrayをnp.sort関数で並び替え

それでは、np.array関数で並び替えて見ましょう。第二引数のaxis=で何を基準に並び変えるのかを指定することができます。

In [2]:
''' np.sort関数 '''

#   axis=1 で行を基準に並び替え
array1 = np.sort(array, axis=1)
print(array1)
#  axis=0 で列を基準に並び替え
array2 = np.sort(array, axis=0)
print(array2)
[[  3  20 100]
 [  1  30 200]
 [  2  10 300]]
[[  1   3   2]
 [ 20  10  30]
 [300 200 100]]

要素を並び替えた新しいarrayができましたね。

3.2. PythonのNumpyのarrayをnp.sortメソッドで並び替え

次にnp.sortメソッドを見てみましょう。これは既存のarrayの要素を並び替えます。この場合も引数にaxis=を書くことができます。

In [1]:
''' np.sortメソッド '''

#既存のarrayを並び替える。
array_a = np.array([[20, 3, 100], [1, 200, 30], [300, 10, 2]])
array_a.sort()
print(array_a)

#  列を基準に並び替え
array_b = np.array([[20, 3, 100], [1, 200, 30], [300, 10, 2]])
array_b.sort(axis=0)
print(array_b)
[[  3  20 100]
 [  1  30 200]
 [  2  10 300]]
[[  1   3   2]
 [ 20  10  30]
 [300 200 100]]

新しいarrayを作るのではなく、既存のarrayが並び替えられていることにご注目ください。

4.まとめ

Pythonのsortのポイントは次の通りです。

  • sortメソッドはリストに対してのみ使うことができる。
  • sorted関数は、リスト以外にタプル、辞書、集合に使うことができる。
  • Numpyのarrayにはnp.sort関数とnp.sortメソッドが用意されている。
  • sortメソッドは既存のオブジェクトの要素を並び替える。
  • sorted関数は要素を並び替えた新しいリストを作る(タプルや辞書、集合に対して使った時もリストとして返ってくる)。
  • 辞書に対してsorted関数を使う時は、valuesメソッドやitemsメソッドをっ組み合わせて、キー、値、両方のどれを並び替えるのかを指定する。

次に、sortメソッドやsorted関数の並び替えの法則をもう一度見ておきましょう。

  • 数値は昇順で並び替える。
  • ひらがなやカタカナはあいうえお順、アイウエオ順で並び替える。
  • ひらがなとカタカナがある場合、先にひらがなのあいうえお順、次にカタカナのアイウエオ順で並び替える。
  • ひらがなとカタカナと漢字がある場合、まずひらがなのあいうえお順、次にカタカナのアイウエオ順、最後に漢字の順で並び替える。
  • 英字はアルファベット順で並び替える。
  • 大文字と小文字の英字がある場合、先に大文字の英字のアルファベット順、次に小文字の英字のアルファベット順で並び替える。

以上の点を、実際に試しながら、しっかり頭に入れていきましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる