【Python入門】sort()とsorted()の違いと使い方

python

「リストの値を順番に並べ替えたい」
「データを一時的にソートしたい」

Pythonには、リストを並び替えるための便利な方法が2つあります。

それが sort() メソッドと sorted() 関数です。

この記事では、初心者がつまずきやすいsort()とsorted()の違い・使い方・注意点・応用例まで、わかりやすく説明します。


スポンサーリンク

sort()とsorted()の基本的な使い方

sort()メソッド:リストを直接並び替える

# 数字のリストを作成
my_list = [3, 1, 2]

# リストを直接並び替える
my_list.sort()

# 結果を確認
print(my_list)  # [1, 2, 3]

特徴:

  • リスト自身を変更します
  • 戻り値はNone(何も返さない)

sorted()関数:新しいリストを返す

# 数字のリストを作成
my_list = [3, 1, 2]

# 新しい並び替えたリストを作成
new_list = sorted(my_list)

# 結果を確認
print(new_list)  # [1, 2, 3]
print(my_list)   # [3, 1, 2](元のまま)

特徴:

  • 元のリストは変更されません
  • 新しい並び替えたリストを返します

sort()とsorted()の違いを整理

比較項目sort()sorted()
使える対象リストだけリスト、タプルなど何でも
戻り値None(何も返さない)新しいリスト
元のリスト変更される変更されない
使う場面リスト自体を変更したいとき元のリストを残したいとき

違いを確認する例

# 元のリスト
original = [5, 2, 8, 1]

# sort()を使う場合
list1 = original.copy()  # コピーを作成
list1.sort()
print(f"sort()使用後:{list1}")      # [1, 2, 5, 8]

# sorted()を使う場合
list2 = sorted(original)
print(f"sorted()の結果:{list2}")    # [1, 2, 5, 8]
print(f"元のリスト:{original}")     # [5, 2, 8, 1](変更されていない)

いろいろな並び替え方法

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

# 数字のリスト
nums = [5, 2, 9, 1]

# sort()で降順
nums_sort = nums.copy()
nums_sort.sort(reverse=True)
print(f"sort()で降順:{nums_sort}")  # [9, 5, 2, 1]

# sorted()で降順
nums_sorted = sorted(nums, reverse=True)
print(f"sorted()で降順:{nums_sorted}")  # [9, 5, 2, 1]

文字の長さで並び替える

# 動物の名前リスト
animals = ["ぞう", "ねこ", "きりん", "うま"]

# 文字の長さで並び替え
sorted_by_length = sorted(animals, key=len)
print(f"文字の長さ順:{sorted_by_length}")  # ['ぞう', 'ねこ', 'うま', 'きりん']

# 文字の長さで長い順に並び替え
sorted_by_length_desc = sorted(animals, key=len, reverse=True)
print(f"文字の長い順:{sorted_by_length_desc}")  # ['きりん', 'ぞう', 'ねこ', 'うま']

辞書のリストを特定の値で並び替える

# 生徒の情報リスト
students = [
    {"名前": "田中", "年齢": 15},
    {"名前": "佐藤", "年齢": 14},
    {"名前": "鈴木", "年齢": 16}
]

# 年齢順に並び替え
sorted_by_age = sorted(students, key=lambda x: x["年齢"])

print("年齢順:")
for student in sorted_by_age:
    print(f"  {student['名前']}さん({student['年齢']}歳)")

よくある注意点とエラー

注意点1:sort()の戻り値を間違える

# よくある間違い
data = [3, 1, 2]
result = data.sort()  # ここが間違い!

print(result)  # None(何も入っていない)
print(data)    # [1, 2, 3](こちらが正しい結果)

正しい使い方:

data = [3, 1, 2]
data.sort()  # 戻り値を受け取らない
print(data)  # [1, 2, 3]

注意点2:違う種類のデータが混じっているとエラー

# 数字と文字が混じったリスト
mixed = [1, "二", 3]

# これはエラーになる
# sorted(mixed)  # TypeError: 数字と文字は比較できない

対策:

# 数字だけ取り出して並び替え
numbers_only = [x for x in mixed if isinstance(x, int)]
sorted_numbers = sorted(numbers_only)
print(sorted_numbers)  # [1, 3]

注意点3:大文字と小文字の順番

# 大文字と小文字が混じった文字
words = ["banana", "Apple", "cherry"]

# 普通に並び替え(大文字が先に来る)
normal_sort = sorted(words)
print(f"普通のソート:{normal_sort}")  # ['Apple', 'banana', 'cherry']

# 大文字小文字を無視して並び替え
case_ignore = sorted(words, key=str.lower)
print(f"大文字小文字無視:{case_ignore}")  # ['Apple', 'banana', 'cherry']

実際に使える例

例1:テストの点数を高い順に並び替え

# テストの点数リスト
test_scores = [85, 92, 78, 95, 88]

# 高い順に並び替え
high_to_low = sorted(test_scores, reverse=True)

print("テスト結果(高い順):")
for i, score in enumerate(high_to_low, 1):
    print(f"{i}位:{score}点")

例2:名前をあいうえお順に並び替え

# クラスの名簿
class_members = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]

# あいうえお順に並び替え
sorted_members = sorted(class_members)

print("あいうえお順の名簿:")
for i, name in enumerate(sorted_members, 1):
    print(f"{i}. {name}")

例3:商品を価格順に並び替え

# 商品リスト
products = [
    {"商品名": "りんご", "価格": 150},
    {"商品名": "バナナ", "価格": 100},
    {"商品名": "みかん", "価格": 120}
]

# 価格の安い順に並び替え
cheap_to_expensive = sorted(products, key=lambda x: x["価格"])

print("価格の安い順:")
for product in cheap_to_expensive:
    print(f"{product['商品名']}:{product['価格']}円")

例4:ファイル名を整理

# ファイル名リスト
files = ["レポート3.txt", "レポート1.txt", "レポート10.txt", "レポート2.txt"]

# 普通に並び替え(文字順)
normal_sort = sorted(files)
print(f"文字順:{normal_sort}")

# 数字部分を考慮して並び替え(応用例)
import re

def extract_number(filename):
    match = re.search(r'(\d+)', filename)
    return int(match.group(1)) if match else 0

number_sort = sorted(files, key=extract_number)
print(f"数字順:{number_sort}")

例5:成績表の作成

# 生徒の成績データ
grades = [
    {"名前": "田中", "国語": 85, "数学": 90, "英語": 78},
    {"名前": "佐藤", "国語": 92, "数学": 85, "英語": 88},
    {"名前": "鈴木", "国語": 78, "数学": 95, "英語": 85}
]

# 合計点で並び替え
def total_score(student):
    return student["国語"] + student["数学"] + student["英語"]

ranked_students = sorted(grades, key=total_score, reverse=True)

print("成績順位:")
for i, student in enumerate(ranked_students, 1):
    total = total_score(student)
    print(f"{i}位:{student['名前']}(合計{total}点)")

どちらを使うべき?

sort()を使う場面

  • 元のリストを変更してもよいとき
  • メモリを節約したいとき
  • そのリストを今後もずっと使うとき
# 例:在庫リストを整理
inventory = ["商品C", "商品A", "商品B"]
inventory.sort()  # 元のリストを直接整理
print(inventory)  # ['商品A', '商品B', '商品C']

sorted()を使う場面

  • 元のリストを残したいとき
  • 一時的に並び替えたいとき
  • 複数の並び方を試したいとき
# 例:いろいろな順番で表示
scores = [85, 92, 78, 95, 88]

print("元の順番:", scores)
print("小さい順:", sorted(scores))
print("大きい順:", sorted(scores, reverse=True))
print("元の順番(確認):", scores)  # 変更されていない

まとめ

Pythonでは、状況に応じて sort()sorted() を使い分けることで、データの並び替えを柔軟かつ安全に行うことができます。

この記事のポイント

  • sort() はリストを その場で変更、何も返さない
  • sorted()元を変更せず新しいリストを返す
  • key で条件指定、reverse=True で降順にも対応
  • 違う種類のデータや戻り値の扱いには注意

コメント

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