[Python入門]リストの操作Python入門(3/4 ページ)

» 2023年10月16日 05時00分 公開
[かわさきしんじDeep Insider編集部]

リストの並べ替え:sortメソッド/sorted関数

 リストの要素を特定の順序で並べ替えるには、リストのsortメソッドまたは組み込みのsorted関数を使える。以下の構文から分かると思うが、パラメーターkeyとreverseはキーワード引数としてのみ指定できる(キーワード専用引数については第13回「関数の引数」の「位置専用引数とキーワード専用引数」を参照のこと)。

sortメソッド

リスト.sort(*, key=None, reverse=False)


 リストの要素の大小関係を基に、それらを昇順に(小さいものから大きいものへ)並べ替える。キーワード引数「key」には、比較に用いる際のキーとなる値を算出する関数を与える(この関数は引数を1つだけ取るものとする)。同じくキーワード引数の「reverse」にTrueを指定すると、降順に並べ替えが行われる。パラメーターkeyとreverseは省略可能。

パラメーター 説明
key リストの要素を比較する際のキーを算出するための1引数関数を指定するキーワード引数(省略可能)。省略した場合は要素の値そのものを使って大小比較が行われる。指定した場合は、リストの要素をその関数に渡した結果を使って大小比較が行われる
reverse キーワード引数。Trueを指定するとリストを降順に並べ替える。デフォルト値はFalse
sortメソッドのパラメーター


 sortメソッドは全要素を「<」演算子を用いて、大小比較して、昇順に(小さい順に)並べ替える。リストの要素そのものの並べ替えが行われる点に注意しよう。以下に例を示す。

intlist = [6, 8, -2, -10, -3, 2, 5, 6, -9, 8]
intlist.sort()  # intlistを並べ替える
print(intlist)  # 出力:[-10, -9, -3, -2, 2, 5, 6, 6, 8, 8]

intlist = [6, 8, -2, -10, -3, 2, 5, 6, -9, 8]
intlist.sort(reverse=True)
print(intlist)  # 出力:[8, 8, 6, 6, 5, 2, -2, -3, -9, -10]

intlist = [6, 8, -2, -10, -3, 2, 5, 6, -9, 8]
intlist.sort(key=abs)  # 絶対値を基に並べ替え
print(intlist)  # 出力:[-2, 2, -3, 5, 6, 6, 8, 8, -9, -10]

sortメソッドの使用例

 実行結果を以下に示す。

実行結果 実行結果

 この例では、まず何も指定せずにsortメソッドを呼び出している。そのため、小さい方から大きい方へと要素が並べ替えられている。次の呼び出しでは、「reverse=True」とキーワード引数を指定しているので、それとは逆の順番に並べ替えられている。最後の呼び出しでは、「key=abs」として各要素の絶対値を基準に並べ替えを行っている。

 ここで注意したいのは、リスト(intlist)自体の要素が並べ替えられていることだ。もともとの順序を維持したまま、並べ替えの結果だけを得たいのであれば、組み込みのsorted関数を使用する。これは、メソッドではなく、第1引数に反復可能オブジェクトを渡すことを除けば、sortメソッドと同様だ(2つのキーワード引数も同様)。以下に例を示す(実行結果は省略)。

intlist = [6, 8, -2, -10, -3, 2, 5, 6, -9, 8]

result = sorted(intlist, key=abs)
print(intlist)
print(result)

sorted関数の使用例

 もう1つ例を出そう。文字列を要素とする以下のようなリストがあるとする。

strlist = ['abc', 'Abc', 'def', 'deF']

大文字/小文字が入り混じった文字列を要素とするリスト

 要素には大文字や小文字が混在していることに注目されたい。このリストをsorted関数で並べ替えてみる(何度か並べ替えを試してみるため、ここでは破壊的操作を行うsortメソッドではなく、新たにリストを作成するsorted関数を使用する)。

strlist = ['abcd', 'abc', 'Abcd', 'abC']
print(sorted(strlist))

大文字/小文字が入り混じった文字列を要素とするリスト

 結果はどのようになるだろうか。

sorted関数による並べ替えの結果 sorted関数による並べ替えの結果

 なぜ、このような順序に並べ替えられるかというと、文字列を比較する際にはおおよそ次のようなルールがあるからだ。

  • コードポイントが小さいものほど小さい値とされる
  • 2つの文字列の大小は先頭の文字、2文字目、3文字目……という順序で比較される
  • 2つの文字列があり、それらの要素が途中までは全く同じだが、一方は最後に1文字だけ追加されている場合(上の'abc'と'abcd')などは文字列が短い方が小さい値とされる

 一般的にはアルファベットの大文字「A」〜「Z」には「65」〜「90」というコードポイントが、小文字「a」〜「z」には「97」〜「122」というコードポイントが割り振られている。そのため、文字「A」と文字「a」では前者の方が小さいと見なされる。文字列'Abc'と文字列'abc'は、1文字目の比較の時点で前者が小さいと見なされる。

 このような並べ替えの規則が妥当なこともあれば、そうではないこともある。そうしたときには、keyパラメーターに「文字列の内容を全て小文字化あるいは大文字化」することで、大文字小文字の違いを無視して並べ替えることも可能だ。以下に例を示す。

print(sorted(strlist, key=str.lower))

keyパラメーターにstr.lower関数を指定して、全ての要素を小文字化した上で並べ替えを行う

 この場合の実行結果を以下に示す。

全ての要素を小文字化して並べ替えを行った結果 全ての要素を小文字化して並べ替えを行った結果

 この場合は、文字列が持つlowerメソッドを使って全ての要素が小文字化され、結果的に2つの文字列'abc'と2つの文字列'abcd'が並べ替えの際の比較で使われる。そのため、上に示したような順序に並べ替えられるというわけだ。大文字小文字を考慮しない並べ替えではstr.lowerメソッドやstr.upperメソッドで全ての文字列を小文字か大文字に統一するというのはイディオムでもあるので覚えておこう。

 この他にも、リストを要素とするリストを並べ替える際に、要素となっているリストのどの要素を並べ替えのキーとするかの指定でもkeyパラメーターは便利に使える(例えば、「名前」「身長」「体重」「年齢」を要素とするリストが要素となっているリストがあったとしよう。その場合に、名前や身長などで並べ替えを行うときに、keyパラメーターが使えるはずだ)。

リストの反転:reverseメソッド/reversed関数

 リストの要素を逆順に並べ替えるには、reverseメソッドとreversed関数が使える。reverseメソッドは元のリストを書き換えるもので、reversed関数は元のリストの要素を引数に取り、逆順に取り出す「イテレータ」オブジェクトを戻り値とする。sorted関数は元のリストを並べ替えたリストを戻り値としたが、reversed関数は「イテレータ」を戻りとする点が異なるので注意しよう。なお、「イテレータ」とは「データを反復的に取り出す」ことが可能なオブジェクトだ。これをlist関数に渡せば、逆順に並んだリストが得られる。

 以下に使用例を示す。

intlist1 = list(range(5))
print(intlist1)

intlist1.reverse()
print(intlist1)

intlist2 = list(range(7))
intlist3 = list(reversed(intlist2))
print(intlist2)
print(intlist3)

reverseメソッドとreversed関数の使用例

 実行結果を以下に示す。

実行結果 実行結果

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。