Python sorted関数とは?並び替えの基本的な使い方

Python初心者向けにsorted関数の使い方を詳しく解説。リストやタプルの並び替え、逆順ソート、カスタムソートキーの使用方法を実例で説明します。

プログラミング初心者ガイド
27 分で読めます

データの並び替えで困ったことはありませんか?

みなさん、Pythonでデータを扱う時に「このリストを順番に並べたい」と思ったことはありませんか?

「データがバラバラで見づらい」 「大きい順に並び替えたい」 「名前順に整理したい」

このような場面で活躍するのが、sorted関数なんです。

この記事では、Python初心者の方向けにsorted関数の基本的な使い方から応用的な活用法まで詳しく解説します。 データを簡単に並び替える方法を身につけて、プログラミングをもっと楽しくしましょう!

sorted関数って何?

sorted関数は、データを順番に並び替えてくれる便利な機能です。

簡単に言うと、リストやタプルなどのデータを小さい順や大きい順に整理してくれます。

基本的な仕組み

sorted(並び替えたいデータ, key=None, reverse=False)

パラメータの説明を見てみましょう。

  • 並び替えたいデータ: リスト、タプル、文字列など
  • key: 並び替えの基準を指定(省略可能)
  • reverse: Trueで大きい順、Falseで小さい順(省略可能)

重要な特徴

sorted関数には大切な特徴があります。

  • 元のデータは変更されない(新しいリストを作成)
  • 常にリストを返す(元がタプルや文字列でも)

この特徴を覚えておくと、安全にデータを扱えます。

基本的な使い方

実際にsorted関数を使ってみましょう。

簡単な例から始めて、少しずつ理解を深めていきます。

数値のリストを並び替え

最も基本的な使い方から見ていきましょう。

numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# 小さい順に並び替え
sorted_asc = sorted(numbers)
print(f"小さい順: {sorted_asc}")
# 大きい順に並び替え
sorted_desc = sorted(numbers, reverse=True)
print(f"大きい順: {sorted_desc}")
# 元のリストは変更されない
print(f"元のリスト: {numbers}")

このコードでは数値のリストを昇順と降順で並び替えしています。

reverse=Trueを指定することで、大きい順に並び替えられます。

実行結果:

小さい順: [1, 1, 2, 3, 4, 5, 6, 9] 大きい順: [9, 6, 5, 4, 3, 2, 1, 1] 元のリスト: [3, 1, 4, 1, 5, 9, 2, 6]

元のリストが変更されていないことが確認できますね。

文字列のリストを並び替え

文字列も同じように並び替えできます。

fruits = ["banana", "apple", "cherry", "date"]
# アルファベット順
sorted_fruits = sorted(fruits)
print(f"アルファベット順: {sorted_fruits}")
# 逆アルファベット順
sorted_fruits_rev = sorted(fruits, reverse=True)
print(f"逆アルファベット順: {sorted_fruits_rev}")

文字列はアルファベット順に並び替えられます。

実行結果:

アルファベット順: ['apple', 'banana', 'cherry', 'date'] 逆アルファベット順: ['date', 'cherry', 'banana', 'apple']

文字列の文字を並び替え

文字列の中の文字も並び替えできます。

word = "python"
# 文字を並び替え(結果はリスト)
sorted_chars = sorted(word)
print(f"文字を並び替え: {sorted_chars}")
# 文字列として結合
sorted_word = ''.join(sorted(word))
print(f"並び替え後の文字列: {sorted_word}")

文字列をsortedに渡すと、文字のリストが返されます。

join()メソッドを使うことで、再び文字列にできます。

実行結果:

文字を並び替え: ['h', 'n', 'o', 'p', 't', 'y'] 並び替え後の文字列: hnotyp

文字が辞書順に並び替えられました。

いろいろなデータ型での並び替え

sorted関数は、リスト以外のデータ型でも使えます。

それぞれの特徴を理解しておきましょう。

タプルの並び替え

タプルも並び替えできますが、結果はリストになります。

coordinates = (3, 1, 4, 1, 5)
# タプルを並び替え(結果はリスト)
sorted_coords = sorted(coordinates)
print(f"並び替え結果: {sorted_coords}")
print(f"結果の型: {type(sorted_coords)}")
# タプルとして戻したい場合
sorted_tuple = tuple(sorted(coordinates))
print(f"タプル形式: {sorted_tuple}")

sorted関数は常にリストを返すことを覚えておきましょう。

tuple()関数を使うことで、再びタプルに変換できます。

実行結果:

並び替え結果: [1, 1, 3, 4, 5] 結果の型: <class 'list'> タプル形式: (1, 1, 3, 4, 5)

辞書のキーや値を並び替え

辞書のキーや値も並び替えできます。

data = {"c": 3, "a": 1, "b": 2}
# キーを並び替え
sorted_keys = sorted(data.keys())
print(f"ソート済みキー: {sorted_keys}")
# 値を並び替え
sorted_values = sorted(data.values())
print(f"ソート済み値: {sorted_values}")
# キーと値のペアを並び替え
sorted_items = sorted(data.items())
print(f"ソート済みアイテム: {sorted_items}")

**辞書のキー、値、アイテム(キーと値のペア)**をそれぞれ並び替えられます。

実行結果:

ソート済みキー: ['a', 'b', 'c'] ソート済み値: [1, 2, 3] ソート済みアイテム: [('a', 1), ('b', 2), ('c', 3)]

アイテムは、キーの順番で並び替えられます。

key引数でカスタムソート

key引数を使うと、独自の基準で並び替えできます。

これを覚えると、sorted関数がさらに便利になります。

文字列の長さでソート

文字列を長さ順に並び替えてみましょう。

words = ["python", "java", "c", "javascript", "go"]
# 文字列の長さでソート
sorted_by_length = sorted(words, key=len)
print(f"長さ順: {sorted_by_length}")
# 長さの降順
sorted_by_length_desc = sorted(words, key=len, reverse=True)
print(f"長さ降順: {sorted_by_length_desc}")

key=lenを指定することで、文字列の長さを基準に並び替えられます。

実行結果:

長さ順: ['c', 'go', 'java', 'python', 'javascript'] 長さ降順: ['javascript', 'python', 'java', 'go', 'c']

短い文字列から長い文字列の順に並んでいますね。

大文字小文字を無視したソート

通常のソートでは大文字と小文字が区別されます。

names = ["Alice", "bob", "Charlie", "david"]
# 通常のソート(大文字小文字を区別)
normal_sort = sorted(names)
print(f"通常ソート: {normal_sort}")
# 大文字小文字を無視したソート
case_insensitive = sorted(names, key=str.lower)
print(f"大文字小文字無視: {case_insensitive}")

key=str.lowerを使うことで、すべて小文字として比較されます。

実行結果:

通常ソート: ['Alice', 'Charlie', 'bob', 'david'] 大文字小文字無視: ['Alice', 'bob', 'Charlie', 'david']

大文字小文字を区別しない自然な順序で並び替えられました。

絶対値でソート

負の数を含む場合、絶対値で並び替えることもできます。

numbers = [-5, 2, -8, 1, 3, -1]
# 絶対値でソート
sorted_by_abs = sorted(numbers, key=abs)
print(f"絶対値順: {sorted_by_abs}")

key=absを指定することで、絶対値を基準に並び替えられます。

実行結果:

絶対値順: [-1, 1, 2, 3, -5, -8]

絶対値が小さい順に並んでいることがわかります。

複雑なデータ構造のソート

実際のプログラムでは、もっと複雑なデータを扱うことが多いです。

辞書やタプルのリストを並び替える方法を学びましょう。

辞書のリストをソート

学生の情報が入った辞書のリストを並び替えてみましょう。

students = [
{"name": "田中", "age": 20, "score": 85},
{"name": "佐藤", "age": 22, "score": 92},
{"name": "鈴木", "age": 19, "score": 78},
{"name": "高橋", "age": 21, "score": 95}
]
# 年齢でソート
sorted_by_age = sorted(students, key=lambda x: x["age"])
print("年齢順:")
for student in sorted_by_age:
print(f" {student['name']}: {student['age']}歳")
# スコアでソート(高い順)
sorted_by_score = sorted(students, key=lambda x: x["score"], reverse=True)
print("
スコア順(高い順):")
for student in sorted_by_score:
print(f" {student['name']}: {student['score']}点")

lambda関数を使って、辞書の特定のキーを基準に並び替えています。

**lambda x: x["age"]**は「各辞書のageキーの値を返す関数」という意味です。

実行結果:

年齢順: 鈴木: 19歳 田中: 20歳 高橋: 21歳 佐藤: 22歳 スコア順(高い順): 高橋: 95点 佐藤: 92点 田中: 85点 鈴木: 78点

タプルのリストをソート

座標データをいろいろな基準で並び替えてみましょう。

coordinates = [(3, 2), (1, 4), (2, 1), (1, 2)]
# x座標(最初の要素)でソート
sorted_by_x = sorted(coordinates, key=lambda x: x[0])
print(f"x座標順: {sorted_by_x}")
# y座標(2番目の要素)でソート
sorted_by_y = sorted(coordinates, key=lambda x: x[1])
print(f"y座標順: {sorted_by_y}")
# 原点からの距離でソート
sorted_by_distance = sorted(coordinates, key=lambda x: x[0]**2 + x[1]**2)
print(f"原点からの距離順: {sorted_by_distance}")

lambda関数で計算式も書けるので、原点からの距離でも並び替えられます。

実行結果:

x座標順: [(1, 4), (1, 2), (2, 1), (3, 2)] y座標順: [(2, 1), (1, 2), (3, 2), (1, 4)] 原点からの距離順: [(2, 1), (1, 2), (3, 2), (1, 4)]

それぞれ異なる基準で並び替えられました。

複数条件でのソート

複数の条件を組み合わせて並び替えることもできます。

実用的な例を見てみましょう。

複数のキーでソート

社員データを部署と年齢で並び替えてみましょう。

employees = [
("田中", "開発部", 28, 450000),
("佐藤", "営業部", 32, 520000),
("鈴木", "開発部", 25, 380000),
("高橋", "営業部", 29, 480000),
("伊藤", "開発部", 35, 600000)
]
# 部署→年齢の順でソート
sorted_employees = sorted(employees, key=lambda x: (x[1], x[2]))
print("部署→年齢順:")
for emp in sorted_employees:
print(f" {emp[0]} ({emp[1]}, {emp[2]}歳)")
# 部署→給与の降順でソート
sorted_by_dept_salary = sorted(employees, key=lambda x: (x[1], -x[3]))
print("
部署→給与順(給与は高い順):")
for emp in sorted_by_dept_salary:
print(f" {emp[0]} ({emp[1]}, {emp[3]:,}円)")

タプルで複数の条件を指定できます。

**-x[3]**のようにマイナスを付けることで、その項目だけ降順にできます。

実行結果:

部署→年齢順: 鈴木 (開発部, 25歳) 田中 (開発部, 28歳) 伊藤 (開発部, 35歳) 高橋 (営業部, 29歳) 佐藤 (営業部, 32歳) 部署→給与順(給与は高い順): 伊藤 (開発部, 600,000円) 田中 (開発部, 450,000円) 鈴木 (開発部, 380,000円) 佐藤 (営業部, 520,000円) 高橋 (営業部, 480,000円)

部署順に並び、同じ部署内では指定した条件で並び替えられました。

実用的な活用例

sorted関数を使った実用的な例を見てみましょう。

日常的なプログラミングでよく使われる場面です。

成績処理システム

学生の成績を処理するシステムを作ってみましょう。

def calculate_grade(score):
"""点数から評価を計算"""
if score >= 90: return "A"
elif score >= 80: return "B"
elif score >= 70: return "C"
elif score >= 60: return "D"
else: return "F"
test_scores = [
{"student": "田中", "math": 85, "english": 92, "science": 78},
{"student": "佐藤", "math": 76, "english": 84, "science": 88},
{"student": "鈴木", "math": 94, "english": 89, "science": 95},
{"student": "高橋", "math": 68, "english": 75, "science": 82}
]
# 各学生の平均点を計算
for score in test_scores:
avg = (score["math"] + score["english"] + score["science"]) / 3
score["average"] = round(avg, 1)
score["grade"] = calculate_grade(avg)
# 平均点順(高い順)でソート
sorted_by_average = sorted(test_scores, key=lambda x: x["average"], reverse=True)
print("成績順位:")
for i, student in enumerate(sorted_by_average, 1):
print(f"{i}位: {student['student']} - 平均{student['average']}点 (評価: {student['grade']})")

平均点を計算して、成績順にランキングを作成しています。

enumerate関数を使うことで、順位も表示できます。

実行結果:

成績順位: 1位: 鈴木 - 平均92.7点 (評価: A) 2位: 田中 - 平均85.0点 (評価: B) 3位: 佐藤 - 平均82.7点 (評価: B) 4位: 高橋 - 平均75.0点 (評価: C)

商品管理システム

商品データを様々な条件で並び替えてみましょう。

products = [
{"name": "ノートPC", "price": 89800, "category": "電子機器", "stock": 15},
{"name": "マウス", "price": 2500, "category": "周辺機器", "stock": 50},
{"name": "キーボード", "price": 8500, "category": "周辺機器", "stock": 30},
{"name": "モニター", "price": 25000, "category": "電子機器", "stock": 8},
{"name": "ヘッドホン", "price": 12000, "category": "周辺機器", "stock": 20}
]
# 価格順(安い順)
sorted_by_price = sorted(products, key=lambda x: x["price"])
print("価格順(安い順):")
for product in sorted_by_price:
print(f" {product['name']}: {product['price']:,}円")
# カテゴリ→在庫の少ない順
sorted_by_category_stock = sorted(products, key=lambda x: (x["category"], x["stock"]))
print("
カテゴリ→在庫順:")
for product in sorted_by_category_stock:
print(f" {product['name']} ({product['category']}): {product['stock']}個")

複数の基準を組み合わせて、実用的な並び替えができます。

実行結果:

価格順(安い順): マウス: 2,500円 キーボード: 8,500円 ヘッドホン: 12,000円 モニター: 25,000円 ノートPC: 89,800円 カテゴリ→在庫順: モニター (電子機器): 8個 ノートPC (電子機器): 15個 ヘッドホン (周辺機器): 20個 キーボード (周辺機器): 30個 マウス (周辺機器): 50個

カテゴリ別に分かれて、在庫の少ない順に並んでいます。

sortメソッドとの違い

sorted関数の他に、list.sort()メソッドもあります。

違いを理解して、適切に使い分けましょう。

基本的な違い

original_list = [3, 1, 4, 1, 5, 9, 2, 6]
# sorted()関数:元のリストは変更されない
sorted_result = sorted(original_list)
print(f"sorted()結果: {sorted_result}")
print(f"元のリスト: {original_list}")
# list.sort()メソッド:元のリストを変更
copy_list = original_list.copy()
copy_list.sort()
print(f"sort()後のリスト: {copy_list}")

sorted関数は新しいリストを作り、sortメソッドは元のリストを変更します。

実行結果:

sorted()結果: [1, 1, 2, 3, 4, 5, 6, 9] 元のリスト: [3, 1, 4, 1, 5, 9, 2, 6] sort()後のリスト: [1, 1, 2, 3, 4, 5, 6, 9]

使い分けの指針

どちらを使うかは、目的によって決めましょう。

# 元のデータを保持したい場合
original_data = [5, 2, 8, 1, 9]
processed_data = sorted(original_data) # sorted()を使用
# 元のデータを変更してもよい場合
data_to_modify = [5, 2, 8, 1, 9]
data_to_modify.sort() # sort()メソッドを使用(メモリ効率的)
# 他の操作と組み合わせる場合
result = sorted([5, 2, 8, 1, 9])[:3] # 上位3つを取得
print(f"上位3つ: {result}")

sorted関数は他の操作とチェーンしやすいのが特徴です。

実行結果:

上位3つ: [1, 2, 5]

sorted関数の結果にすぐスライシングを適用できました。

エラーと対処法

sorted関数を使う時に起こりがちなエラーと対処法を学びましょう。

異なる型が混在する場合

Python 3では、異なる型同士の比較でエラーが発生します。

mixed_data = [3, "hello", 1, "world", 2]
# Python 3では異なる型の比較でエラーが発生
try:
result = sorted(mixed_data)
except TypeError as e:
print(f"エラー: {e}")
# 型を統一してソート
numbers_only = [x for x in mixed_data if isinstance(x, (int, float))]
strings_only = [x for x in mixed_data if isinstance(x, str)]
sorted_numbers = sorted(numbers_only)
sorted_strings = sorted(strings_only)
print(f"数値のみ: {sorted_numbers}")
print(f"文字列のみ: {sorted_strings}")

型をチェックして分けてからそれぞれ並び替えましょう。

実行結果:

エラー: '<' not supported between instances of 'str' and 'int' 数値のみ: [1, 2, 3] 文字列のみ: ['hello', 'world']

None値を含むデータの処理

None値があるデータの並び替え方法を見てみましょう。

data_with_none = [3, None, 1, None, 5, 2]
# None値を除外してソート
filtered_data = [x for x in data_with_none if x is not None]
sorted_filtered = sorted(filtered_data)
print(f"None除外: {sorted_filtered}")
# None値を特別扱いするソート
def none_safe_key(item):
return (item is None, item)
sorted_with_none = sorted(data_with_none, key=none_safe_key)
print(f"None値考慮: {sorted_with_none}")

カスタムkey関数を作ることで、None値も適切に処理できます。

実行結果:

None除外: [1, 2, 3, 5] None値考慮: [1, 2, 3, 5, None, None]

None値が最後に配置されて、うまく処理できました。

まとめ: sorted関数で効率的なデータ処理

sorted関数は、Pythonでデータを並び替える最も基本的で強力な機能です。

基本的な使い方から応用まで理解できれば、データ処理がとても楽になります。

sorted関数の特徴

覚えておきたい重要なポイントです。

  • 新しいリスト作成: 元のデータを変更せずに新しいソート済みリストを返す
  • 柔軟なカスタマイズ: key引数で独自のソート条件を指定可能
  • 多様なデータ対応: リスト、タプル、文字列など様々なデータ型に対応

主な使用場面

日常的なプログラミングでよく使われる場面です。

  • データ分析: スコアや売上データの順位付け
  • ファイル管理: ファイル名や日付での並び替え
  • ユーザーインターフェース: 表示データの整理

覚えておくべきポイント

これだけは覚えておきましょう。

  • 基本形: sorted(data) で昇順ソート
  • 降順: reverse=True で降順ソート
  • カスタムソート: key=関数 で独自のソート条件
  • 複数条件: タプルでの複数キー指定

sorted関数をマスターすることで、データの整理や分析がより効率的に行えるようになります。

まずは基本的な使い方から始めて、徐々にカスタムソートキーや複雑な条件でのソートにも挑戦してみてください!

関連記事