【コード有り】Pythonのsort|さまざまなメソッドを徹底解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新日:2023年7月)

✔当記事は以下のような方に向けて書かれています

「Pythonのsort関数をどう使うのか知りたい」
「sort関数の書き方の基本を学びたい」
「具体的なsort関数の使用例を見て、理解を深めたい」

✔当記事を通じて得られる知識

  • Pythonのsort関数の使用法
  • sort関数の基本的な書き方とその応用方法
  • sort関数を使用した実例

当記事では、Pythonのsort関数の基本的な使い方から、多様なオプションを駆使した進んだ使用方法まで、具体的な例を交えて詳細に解説します。

ぜひ最後までお読みください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonの基本―リスト型とそのソート

Pythonでのソート操作の基本についてお伝えします。

基本をおさえたうえで、先へ進みましょう。

  • ソートの基本とその重要性
  • リスト型とは
  • メソッドsort()を用いたリストソート
  • 新たなリストの生成:組み込み関数sorted()

ソートの基本とその重要性

ソートは、データを特定の順序で並べるプロセスです。

Pythonは、データ解析や自動化など、幅広い用途で使用されるプログラミング言語であり、ソートはその中でも非常に重要な操作といえます。

ソートを行うことで、データを解析しやすくなり、情報の可視化や、より高度なアルゴリズムの適用が可能になるのです。

リスト型とは

Pythonのリストは、複数の要素を順序付けて格納するデータ型です。

これらの要素は、異なるデータ型でも構いません。

リストは、ブラケット[]を使用して作成され、コンマで区切られた要素を含みます。

my_list = [1, 2, 3, "apple", 5.6]

Pythonのリストについてはこちらをどうぞ。

メソッドsort()を用いたリストソート

Pythonのリストにはsort()というメソッドがあり、リストの要素を昇順にソートできるものです。

sort()メソッドは、リスト自体を変更します。

numbers = [2, 4, 1, 3, 5]
numbers.sort()
print(numbers)
# 出力: [1, 2, 3, 4, 5]

新たなリストの生成:組み込み関数sorted()

sorted()関数は、リストをソートした結果を新しいリストとして返します

この関数では、元のリストを変更されず、ソートされた新しいリストが作成されるのです

元のリストを保持しながらソートされたバージョンが必要な場合に便利です。

numbers = [2, 4, 1, 3, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# 出力: [1, 2, 3, 4, 5]
print(numbers)
# 出力: [2, 4, 1, 3, 5]

ソートの進行:引数keyの活用

こちらでは、Pythonのソートにおいて重要な引数keyの使用法に焦点を当てます。

  • sort()とsorted()における引数keyの用途
  • Key関数の理解

sort()とsorted()における引数keyの用途

sort()メソッドとsorted()関数は、key引数を受け取れます。

key引数は、ソートの際に各要素に適用される関数を指定するもの。

これにより、要素の比較がその関数の結果に基づいて行われます。

words = ["apple", "banana", "cherry", "date"]
# 文字列の長さに基づいてソート
sorted_words = sorted(words, key=len)
print(sorted_words)
# 出力: ['date', 'apple', 'banana', 'cherry']

Key関数の理解

key関数は、リストの各要素に適用され、その結果に基づいてソートがおこなわれます。

例えば、オブジェクトのリストを持っている場合、特定の属性に基づいてソートが可能です。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person("Alice", 30), Person("Bob", 20), Person("Eve", 25)]
# 年齢に基づいてソート
sorted_people = sorted(people, key=lambda person: person.age)
# 名前を出力
for person in sorted_people:
    print(person.name)
# 出力: Bob, Eve, Alice

Pythonの各種データ型のソート方法

Pythonにおけるさまざまなデータ型のソート方法について解説します。

  • 文字列のソート手法
  • タプルのソートプロセス

文字列のソート手法

文字列のリストも、アルファベット順や文字数でソートが可能。

大文字と小文字はデフォルトで区別されますが、str.casefold()関数を使用すれば、大文字小文字を無視したソートも実行できます。

words = ["apple", "Banana", "Cherry", "date"]
# 大文字小文字を無視したアルファベット順でソート
sorted_words = sorted(words, key=str.casefold)
print(sorted_words)
# 出力: ['apple', 'Banana', 'Cherry', 'date']

タプルのソートプロセス

タプルのリストもソート可能です。

タプルは不変なので、sort()メソッドは使用できませんが、sorted()関数を使用して新しいリストを作成します

タプルのソートは、最初の要素が最優先で比較され、次に2番目の要素が比較される、というように進みます。

tuples = [(1, 3), (3, 2), (2, 1)]
# タプルをソート
sorted_tuples = sorted(tuples)
print(sorted_tuples)
# 出力: [(1, 3), (2, 1), (3, 2)]

ソートの詳細―さまざまな特性と関数

こちらでは、ソート操作の詳細について深掘りしていきます。

より高度な使い方を理解することで、さまざまなソート方法があることをご理解いただけるはずです。

  • 昇順と降順の指定法
  • ソートの安定性と複合ソートの考慮点
  • 高度なソート: Decorate-Sort-Undecorate
  • ソートのカスタム:ComparisonFunctions
  • 追加モジュール:operator関数の活用

昇順と降順の指定法

sort()メソッドおよびsorted()関数では、要素を降順にソートできます。

reverse引数をTrueにし、降順であることを明示する方法です。

numbers = [2, 4, 1, 3, 5]
# 降順でソート
numbers.sort(reverse=True)
print(numbers)
# 出力: [5, 4, 3, 2, 1]

ソートの安定性と複合ソートの考慮点

ソートの安定性は、元の順序がソート後も保持されることを意味します。

これは、複合ソート(複数のキーでソート)をおこなう場合に特に重要です。

複数のキーでソートする場合、最初のソートキーの順序が次のソートキーで保持されます。

data = [("apple", 3), ("banana", 2), ("cherry", 2), ("date", 1)]
# 文字列で最初にソートし、その後、数字でソート
sorted_data = sorted(data, key=lambda x: x[0]) # 文字列でソート
sorted_data = sorted(sorted_data, key=lambda x: x[1]) # 数字でソート
print(sorted_data)
# 出力: [('date', 1), ('banana', 2), ('cherry', 2), ('apple', 3)]

「banana」「cherry」の数字はどちらも「2」。

ただし最初のソートでアルファベット順に並べているので、「banana」「cherry」の順番が保たれています。

高度なソート: Decorate-Sort-Undecorate

Decorate-Sort-Undecorate(DSU)は、ソート効率を高めるためのパターンです。

要素をソートの前に装飾し(キーと共にタプルとしてラップし)、ソートした後で装飾を解除します。

これにより、ソートのキーに対する計算のオーバーヘッドを削減できます。

words = ["apple", "banana", "cherry"]
# 文字列の長さをキーとしてソート
dsu = [(len(word), word) for word in words]
dsu.sort()
sorted_words = [item[1] for item in dsu]
print(sorted_words)
# 出力: ['apple', 'cherry', 'banana']

ソートのカスタム:Comparison Functions

functools.cmp_to_key()関数を使って、古いスタイルの比較関数をキー関数に変換可能です。

これにより、独自の比較ロジックを使用してソートをカスタマイズできます。

from functools import cmp_to_key

# 古いスタイルの比較関数
def compare(a, b):
    if a < b:
        return -1
    elif a > b:
        return 1
    else:
        return 0

# cmp_to_key()関数を使ってキー関数に変換
key_func = cmp_to_key(compare)

# ソート対象のリスト
data = [4, 2, 7, 1, 5]

# キー関数を使用してリストをソート
sorted_data = sorted(data, key=key_func)

print(sorted_data)  # 出力: [1, 2, 4, 5, 7]

追加モジュール:operator関数の活用

operatorモジュールの関数をkey引数として使用することで、簡潔かつ効率的なソートが可能です。

たとえば、operator.itemgetter()を使用して、タプルの特定の位置に基づいてソートできます。

import operator

# ソート対象のタプルのリスト
data = [(2, 'b'), (1, 'a'), (3, 'c')]

# itemgetterを使って2番目の要素(インデックス1)に基づいてソートする
sorted_data = sorted(data, key=operator.itemgetter(1))

print(sorted_data)  # 出力: [(1, 'a'), (2, 'b'), (3, 'c')]

Pythonソートの応用と注意点

こちらでは、Pythonでのソート操作の応用例と、ソート中に遭遇する典型的なエラーに対処する方法を解説します。

  • ソート時の典型的なエラーと対策
  • Pythonでのソート応用例

ソート時の典型的なエラーと対策

ソート操作中にエラーが発生する場合があります。

これらのエラーは通常、異なるデータ型の比較や、予期せぬ値の影響を受けることが多いです。

これらの問題を回避するために、入力データを検証し、適切なエラーハンドリングを実装することが重要です。

Pythonでのソート応用例

Pythonのソート機能は、データ分析、アルゴリズムの最適化、ゲームの開発など、さまざまな領域で応用できます。

たとえば、データ分析では、データセットを特定の属性に基づいてソートし、トレンドやパターンを見つけるために使用されます。

# データセットのリスト
dataset = [
    {'name': 'Alice', 'age': 25, 'score': 90},
    {'name': 'Bob', 'age': 30, 'score': 85},
    {'name': 'Charlie', 'age': 27, 'score': 95},
    {'name': 'Dave', 'age': 22, 'score': 88},
]

# score属性に基づいてデータセットをソートする
sorted_dataset = sorted(dataset, key=lambda x: x['score'], reverse=True)

# ソート結果を表示する
for data in sorted_dataset:
    print(data)

データセットを辞書のリストとして表現。

sorted()関数のkey引数にlambda関数を使用し、各辞書のscore属性に基づいてソートしています。

まとめ

ソートスキルは、プログラミングにおいて基本的かつ重要な技術です。

データの整理や分析、アルゴリズムの効率化、ユーザーにとってわかりやすい表示を行うために、効果的なソート技術が必要とされます。

これらのスキルを習得することで、より洗練されたプログラムを開発できるでしょう。

タイトルとURLをコピーしました