本ページはプロモーションが含まれています

【Python】要素の並び替え(ソート)の基本(list.sort、sorted)

Pythonリスト組込み型

Pythonでリストの要素をソート(並べ替え)するには以下2つの関数があります。

  • listのメソッド: list.sort()
  • 標準組込み関数: sorted(iterable)

本記事では、これらの違いと使い方についてまとめます。

スポンサーリンク

list.sort()、sorted()の違い

それぞれの違いは下記の通りです。

関数名 内容
list.sort()
  • リストが提供するメソッドの一つ
    → リストのみ使用可(文字列や辞書など他の型は使えない)
  • 返却値はNone
  • データをインプレースで変更するので、元のデータが変更されます
sorted()
  • 任意のイテラブルを引数にとる標準組み込み関数
    → リストの他、タプル、文字列、辞書なども使用可
  • 返却値はソートされたリスト
  • ソートされた新たなリストを返す(=元のデータは変更されない
<参考>イテラブルについてはこちらの記事でも解説しています。ご参照ください。
[Python] イテレータとイテラブルについて

以下、それぞれの関数の詳細について記載します。

list.sort()

リストをインプレースでに並び替えます(デフォルトは昇順)。返却値はNoneです。
リストのメソッドなので、リスト以外は使えません。
※第二引数以降のkey, reverseについては後述。

list.sort(*, key=None, reverse=False)

例を以下に示します。

>>> a = [2, 0, 5, 1, 9]
>>> a.sort()    #返却値はNoneなので何も表示されません
>>> a
[0, 1, 2, 5, 9] #元のデータが変わっています

sorted()

任意のイテラブルを引数に設定することが出来ます。
返却値はソートされたリストです(デフォルトは昇順)。元のデータは変わりません。
※第二引数以降のkey, reverseはsort()と同様で後述します。

sorted(iterable, *, key=None, reverse=False)

例を以下に示します。

>>> a= [2, 0, 5, 1, 9]
>>> sorted(a)  #ソートされた新たなリストが返却
[0, 1, 2, 5, 9]
>>> a     
[2, 0, 5, 1, 9] #元のデータは変わっていません

sorted()はリスト以外のイテラブルでも使えます。
※タプルや辞書の様に要素の中身が2つ以上ある場合は、一番左の要素でソートされます。
別の要素でソートする場合は後述のKeyパラメータを使います。

以下、具体例を示します。

#タプル(一番左側の要素でソート)
>>> l = [("b", 3), ("a", 1), ("c", 2)]
>>> sorted(l)
[('a', 1), ('b', 3), ('c', 2)]

#文字列
>>> l = "2143"
>>> sorted(l)
['1', '2', '3', '4']

#辞書(keyでソートされます)
>>> l = {"b": 3, "a": 1, "c": 2}
>>> sorted(l)
['a', 'b', 'c']

#dic.keys()を使っても同様の結果
>>> sorted(l.keys())
['a', 'b', 'c']

#dic.values()を使うと、辞書のvalueがソートされます
>>> sorted(l.values())
[1, 2, 3]

#dic.items()を使うと、辞書データをタプルを要素としたリストを返却
#タプルの一番左の要素でソートされます。
>>> sorted(l.items())
[('a', 1), ('b', 3), ('c', 2)]

Key function

keyパラメータを使うと、並べ替えの際に条件を指定することができます。
(要素をソートする際にデータを加工したり、ソートする要素を指定したり・・・)

具体的な例をいくつか挙げてみます。

例その1:単語の大文字・小文字を区別なく並べ替える

keyパラメータにkey=str.lowerを設定すると、文字列が全て小文字に変換されてからソートされます。

>>> s = ['How', 'do', 'you', 'get', 'to', 'the', 'Train', 'Station?']
>>> sorted(s, key = str.lower)
['do', 'get', 'How', 'Station?', 'the', 'to', 'Train', 'you']

例その2:タプルの二番目の値でソートしたい場合

lambda関数を使うことも可能です。
以下は、タプルの二番目の要素でソートした場合の例です。

>>> l = [("b", 3), ("a", 1), ("c", 2)]
>>> sorted(l, key = lambda x:x[1])
[('a', 1), ('c', 2), ('b', 3)]

尚、この処理はOperatorモジュール(この場合はitemgetter()メソッド)を使うと、もう少し簡単に書けます。

>>> from operator import itemgetter
>>> sorted(l, key = itemgetter(1))
[('a', 1), ('c', 2), ('b', 3)]

例その3:文字列の長さでソートしたい場合

key = lenとすると文字列の長さでソートできます。
下記は文字列を長さの短い順に並べた例です。

>>> s = ['How', 'do', 'you', 'get', 'to', 'the', 'Train', 'Station?']
>>> sorted(s, key = len)
['do', 'to', 'How', 'you', 'get', 'the', 'Train', 'Station?']

例その4:辞書のvalueでKeyをソートする場合

辞書のvalueでkeyを並び替える例を2つ示します。

>>> d = {"b": 3, "a": 1, "c": 2}

# items()でkey, valueペアのタプルを生成し、2番目の要素で並び替え
>>> sorted(d.items(), key = lambda x: x[1])
[('a', 1), ('c', 2), ('b', 3)]

# 辞書のvalueをlambdaで指定し、keyを並び替え
>>> sorted(d, key = lambda x: d[x])
['a', 'c', 'b']

reverseパラメータ

reverseパラメータは昇順でソートするか、降順でソートするかを設定します。

  • reverse = False : 昇順(デフォルト)
  • reverse = True:降順

例を以下に示します。

#list.sort()の場合
>>> a = [2, 0, 5, 1, 9]
>>> a.sort(reverse = True)
>>> a
[9, 5, 2, 1, 0]

#sorted()の場合
>>> a = [2, 0, 5, 1, 9]
>>> sorted(a, reverse = True)
[9, 5, 2, 1, 0]

確認した環境

  • OS: Ubuntu 20.04LTS
  • Python: ver3.11.2

まとめ

今回は、データの並べ替えについてまとめました。

  • list.sort()とsorted()の使い方と違い
  • キーワード引数key, reverseの使い方

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project