【Python入門】list.sort()の使い方完全ガイド|昇順・降順・カスタムソートのやり方と注意点

python

「リストの数字を小さい順に並べたい」
「文字列をアルファベット順に整理したい」

このような並び替え(ソート)を行いたいとき、Pythonではsort()メソッドがとても便利です。

sort()を使うことで、リストの要素を簡単に昇順や降順に並び替えることができます。

この記事では、sort()の基本的な使い方から、応用的なカスタムソート、sorted()との違いまで、初心者の方にもわかりやすく解説します。

スポンサーリンク

sortメソッドの基本的な使い方

数字のリストを並び替える

sort()メソッドを使うと、リストの要素を小さい順(昇順)に並び替えることができます。

numbers = [3, 1, 4, 2, 5]
print(f"並び替え前: {numbers}")

numbers.sort()
print(f"並び替え後: {numbers}")

実行結果:

並び替え前: [3, 1, 4, 2, 5]
並び替え後: [1, 2, 3, 4, 5]

とても簡単ですね!sort()を呼び出すだけで、リストが自動的に昇順に並び替えられます。

sortの重要な特徴

sort()メソッドには以下の特徴があります:

  • 破壊的操作:元のリストそのものが変更される
  • 戻り値なし:戻り値はNone
  • 昇順がデフォルト:特に指定しなければ小さい順に並ぶ
original_list = [9, 3, 7, 1]
result = original_list.sort()

print(f"元のリスト: {original_list}")  # 変更されている
print(f"戻り値: {result}")              # None

実行結果:

元のリスト: [1, 3, 7, 9]
戻り値: None

降順(大きい順)で並び替える

reverse=Trueオプション

大きい順に並び替えたいときは、reverse=Trueを指定します。

scores = [85, 92, 78, 96, 88]
print(f"元の点数: {scores}")

scores.sort(reverse=True)
print(f"高い順: {scores}")

実行結果:

元の点数: [85, 92, 78, 96, 88]
高い順: [96, 92, 88, 85, 78]

reverseパラメータの使い分け

指定方法並び順
sort() または sort(reverse=False)昇順(小さい順)[1, 2, 3, 4, 5]
sort(reverse=True)降順(大きい順)[5, 4, 3, 2, 1]

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

アルファベット順に並び替え

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

fruits = ["banana", "apple", "cherry", "date"]
print(f"並び替え前: {fruits}")

fruits.sort()
print(f"アルファベット順: {fruits}")

実行結果:

並び替え前: ['banana', 'apple', 'cherry', 'date']
アルファベット順: ['apple', 'banana', 'cherry', 'date']

日本語の文字列も並び替え可能

names = ["田中", "佐藤", "鈴木", "高橋"]
names.sort()
print(f"五十音順: {names}")

実行結果:

五十音順: ['佐藤', '田中', '鈴木', '高橋']

大文字と小文字の扱い

英語の場合、大文字と小文字では大文字が先に来ることに注意してください。

words = ["apple", "Banana", "cherry", "Date"]
words.sort()
print(f"結果: {words}")

実行結果:

結果: ['Banana', 'Date', 'apple', 'cherry']

大文字小文字を区別せずに並び替えたい場合は、後で説明するkeyパラメータを使います。

カスタムソート:keyパラメータの活用

文字列の長さで並び替え

keyパラメータを使うと、独自の基準で並び替えができます。

words = ["python", "java", "c", "javascript"]
print(f"元のリスト: {words}")

words.sort(key=len)
print(f"文字数順: {words}")

実行結果:

元のリスト: ['python', 'java', 'c', 'javascript']
文字数順: ['c', 'java', 'python', 'javascript']

len関数をkeyに指定することで、文字列の長さを基準に並び替えています。

絶対値で並び替え

負の数を含む数値リストを、絶対値の大きさで並び替える例:

numbers = [10, -5, 3, -15, 1]
print(f"元のリスト: {numbers}")

numbers.sort(key=abs)
print(f"絶対値順: {numbers}")

実行結果:

元のリスト: [10, -5, 3, -15, 1]
絶対値順: [1, 3, -5, 10, -15]

ラムダ式を使った複雑な条件

ラムダ式を使うと、より複雑な並び替え条件を指定できます。

# 数字を「偶数を先に、その中で昇順」で並び替え
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
numbers.sort(key=lambda x: (x % 2, x))
print(f"偶数優先: {numbers}")

実行結果:

偶数優先: [2, 4, 6, 8, 1, 3, 5, 7]

この例では、x % 2で偶数(0)か奇数(1)かを判定し、同じグループ内ではxの値で並び替えています。

大文字小文字を区別しない並び替え

words = ["apple", "Banana", "cherry", "Date"]
words.sort(key=str.lower)
print(f"大文字小文字無視: {words}")

実行結果:

大文字小文字無視: ['apple', 'Banana', 'cherry', 'Date']

より複雑なデータの並び替え

辞書のリストを並び替え

students = [
    {"name": "田中", "score": 85},
    {"name": "佐藤", "score": 92},
    {"name": "鈴木", "score": 78}
]

# 点数で並び替え
students.sort(key=lambda student: student["score"])
print("点数の低い順:")
for student in students:
    print(f"{student['name']}: {student['score']}点")

実行結果:

点数の低い順:
鈴木: 78点
田中: 85点
佐藤: 92点

タプルのリストを並び替え

products = [
    ("りんご", 150),
    ("バナナ", 100),
    ("オレンジ", 200)
]

# 価格(2番目の要素)で並び替え
products.sort(key=lambda x: x[1])
print("価格の安い順:")
for name, price in products:
    print(f"{name}: {price}円")

実行結果:

価格の安い順:
バナナ: 100円
りんご: 150円
オレンジ: 200円

複数の条件で並び替え

employees = [
    ("田中", 25, 5000000),
    ("佐藤", 30, 6000000),
    ("鈴木", 25, 4500000),
    ("高橋", 30, 5500000)
]

# 年齢順、同じ年齢なら給与順で並び替え
employees.sort(key=lambda x: (x[1], x[2]))
print("年齢→給与順:")
for name, age, salary in employees:
    print(f"{name}: {age}歳, {salary:,}円")

実行結果:

年齢→給与順:
鈴木: 25歳, 4,500,000円
田中: 25歳, 5,000,000円
高橋: 30歳, 5,500,000円
佐藤: 30歳, 6,000,000円

sort()とsorted()の違い

基本的な違い

Pythonにはsort()メソッドの他に、sorted()関数もあります。この2つは似ていますが、重要な違いがあります。

特徴list.sort()sorted()
対象リストのみあらゆるイテラブル
元データ変更される変更されない
戻り値None新しいリスト
使用方法メソッド関数

実際の比較

# sort()の場合
original = [3, 1, 4, 2]
print(f"元のリスト: {original}")

result_sort = original.sort()
print(f"sort()後の元リスト: {original}")
print(f"sort()の戻り値: {result_sort}")

print("---")

# sorted()の場合
original2 = [3, 1, 4, 2]
print(f"元のリスト: {original2}")

result_sorted = sorted(original2)
print(f"sorted()後の元リスト: {original2}")
print(f"sorted()の戻り値: {result_sorted}")

実行結果:

元のリスト: [3, 1, 4, 2]
sort()後の元リスト: [1, 2, 3, 4]
sort()の戻り値: None
---
元のリスト: [3, 1, 4, 2]
sorted()後の元リスト: [3, 1, 4, 2]
sorted()の戻り値: [1, 2, 3, 4]

sorted()の活用例

# 元のデータを保持しつつ、複数の並び順で表示
scores = [85, 92, 78, 96, 88]

print(f"元の点数: {scores}")
print(f"昇順: {sorted(scores)}")
print(f"降順: {sorted(scores, reverse=True)}")
print(f"元のリストは変更されていない: {scores}")

実行結果:

元の点数: [85, 92, 78, 96, 88]
昇順: [78, 85, 88, 92, 96]
降順: [96, 92, 88, 85, 78]
元のリストは変更されていない: [85, 92, 78, 96, 88]

よくあるエラーと対処法

異なる型が混在している場合

# エラーになる例
mixed_data = [1, "two", 3, "four"]
# mixed_data.sort()  # TypeError が発生

エラーメッセージ:

TypeError: '<' not supported between instances of 'str' and 'int'

対処法:

# 文字列に統一してから並び替え
mixed_data = [1, "two", 3, "four"]
mixed_data_str = [str(item) for item in mixed_data]
mixed_data_str.sort()
print(f"文字列として並び替え: {mixed_data_str}")

実行結果:

文字列として並び替え: ['1', '3', 'four', 'two']

Noneが含まれている場合

# Noneが含まれているリスト
data_with_none = [3, None, 1, None, 2]

# Noneを除外してから並び替え
filtered_data = [x for x in data_with_none if x is not None]
filtered_data.sort()
print(f"None除外後: {filtered_data}")

実行結果:

None除外後: [1, 2, 3]

戻り値を間違って使う場合

# 間違った使い方
numbers = [3, 1, 4, 2]
# sorted_numbers = numbers.sort()  # Noneが代入される

# 正しい使い方
numbers = [3, 1, 4, 2]
numbers.sort()  # リスト自体が変更される
print(f"正しい結果: {numbers}")

# または
numbers2 = [3, 1, 4, 2]
sorted_numbers = sorted(numbers2)  # sorted()を使う
print(f"sorted()の結果: {sorted_numbers}")

パフォーマンスと効率性

大きなリストでの並び替え

import time
import random

# 大きなリストを作成
large_list = [random.randint(1, 10000) for _ in range(100000)]

# sort()の時間測定
start_time = time.time()
large_list.sort()
end_time = time.time()

print(f"10万要素の並び替え時間: {end_time - start_time:.4f}秒")

メモリ効率の考慮

# メモリ効率を重視する場合は sort() を使用
large_data = list(range(1000000, 0, -1))

# sort(): 元のリストを変更(メモリ効率が良い)
large_data.sort()

# sorted(): 新しいリストを作成(メモリを多く使用)
# new_data = sorted(large_data)  # 2倍のメモリが必要

実用的な活用例

ファイルサイズ順でファイルリストを並び替え

files = [
    ("document.txt", 1024),
    ("image.jpg", 2048000),
    ("video.mp4", 104857600),
    ("script.py", 4096)
]

# ファイルサイズ順で並び替え
files.sort(key=lambda x: x[1])
print("ファイルサイズ順:")
for filename, size in files:
    if size < 1024:
        size_str = f"{size}B"
    elif size < 1024**2:
        size_str = f"{size//1024}KB"
    else:
        size_str = f"{size//1024**2}MB"
    print(f"{filename}: {size_str}")

実行結果:

ファイルサイズ順:
document.txt: 1KB
script.py: 4KB
image.jpg: 1MB
video.mp4: 100MB

試験結果の集計と順位付け

test_results = [
    {"name": "田中", "math": 85, "english": 78},
    {"name": "佐藤", "math": 92, "english": 88},
    {"name": "鈴木", "math": 76, "english": 95},
    {"name": "高橋", "math": 88, "english": 82}
]

# 合計点で並び替え
test_results.sort(key=lambda x: x["math"] + x["english"], reverse=True)

print("合計点順位:")
for i, student in enumerate(test_results, 1):
    total = student["math"] + student["english"]
    print(f"{i}位: {student['name']} (数学:{student['math']}, 英語:{student['english']}, 合計:{total})")

実行結果:

合計点順位:
1位: 佐藤 (数学:92, 英語:88, 合計:180)
2位: 鈴木 (数学:76, 英語:95, 合計:171)
3位: 高橋 (数学:88, 英語:82, 合計:170)
4位: 田中 (数学:85, 英語:78, 合計:163)

まとめ

sort()メソッドは、Pythonでリストを並び替えるための基本的で強力な機能です。

重要なポイント

  • sort()はリスト自体を変更する(破壊的操作)
  • 戻り値はNone
  • reverse=Trueで降順、keyパラメータでカスタムソート
  • sorted()は新しいリストを返す(元は変更しない)

使い分けの指針

状況使うべきメソッド理由
元のリストを変更してもよいsort()メモリ効率が良い
元のリストを保持したいsorted()元データが保護される
リスト以外も並び替えたいsorted()あらゆるイテラブルに対応

よく使うパターン

並び替え方法コード例
昇順list.sort()
降順list.sort(reverse=True)
文字列長順list.sort(key=len)
絶対値順list.sort(key=abs)
辞書のキー順list.sort(key=lambda x: x['key'])

コメント

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