Python開発でよく遭遇する「sorted()関数でリストを並び替えたいが、元のリストは保持したい」というケースについて、具体的な解決方法を解説します。

sorted()関数の基本的な使い方

sorted()関数は、イテラブル(リストなど)を引数として受け取り、新しいソート済みリストを返します。重要なポイントは、元のリストを変更せずに新しいリストを生成することです。

# 基本的な使用例
numbers = [3, 1, 4, 1, 5, 9, 2]
sorted_numbers = sorted(numbers)

print(numbers)        # [3, 1, 4, 1, 5, 9, 2] (元のリストは変更されない)
print(sorted_numbers) # [1, 1, 2, 3, 4, 5, 9] (新しいソート済みリスト)

降順でソートする方法

reverse=Trueパラメータを使用することで、降順でソートすることができます。

numbers = [3, 1, 4, 1, 5, 9, 2]
desc_sorted = sorted(numbers, reverse=True)

print(desc_sorted) # [9, 5, 4, 3, 2, 1, 1]

文字列リストのソート

文字列のリストも同様にソートできます。デフォルトでは辞書順でソートされます。

words = ['banana', 'apple', 'cherry']
sorted_words = sorted(words)

print(sorted_words) # ['apple', 'banana', 'cherry']

keyパラメータを使用したカスタムソート

keyパラメータを使用することで、ソートの基準をカスタマイズできます。

# 文字列の長さでソート
words = ['python', 'java', 'javascript']
sorted_by_length = sorted(words, key=len)

print(sorted_by_length) # ['java', 'python', 'javascript']

# 大文字小文字を区別せずにソート
mixed_case = ['Apple', 'banana', 'Cherry']
case_insensitive = sorted(mixed_case, key=str.lower)

print(case_insensitive) # ['Apple', 'banana', 'Cherry']

辞書のソート

辞書のキーや値でソートする場合も、sorted()関数が活用できます。

scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78}

# キーでソート
sorted_by_key = sorted(scores.items())
print(sorted_by_key) # [('Alice', 85), ('Bob', 92), ('Charlie', 78)]

# 値でソート
sorted_by_value = sorted(scores.items(), key=lambda x: x[1])
print(sorted_by_value) # [('Charlie', 78), ('Alice', 85), ('Bob', 92)]

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

list.sort()メソッドは元のリストを直接変更しますが、sorted()関数は新しいリストを返します。以下が両者の違いを示す例です。

# list.sort()の場合
numbers1 = [3, 1, 4, 1, 5]
numbers1.sort()
print(numbers1) # [1, 1, 3, 4, 5] (元のリストが変更される)

# sorted()の場合
numbers2 = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers2)
print(numbers2)        # [3, 1, 4, 1, 5] (元のリストは変更されない)
print(sorted_numbers)  # [1, 1, 3, 4, 5] (新しいソート済みリスト)

まとめ

sorted()関数は、元のデータを保持したままソートを行いたい場合に最適な選択肢です。主な特徴は以下の通りです:

  • 元のリストを変更せず、新しいソート済みリストを返す
  • reverse=Trueで降順ソートが可能
  • keyパラメータでソート基準のカスタマイズが可能
  • 文字列、数値、タプルなど様々なデータ型に対応

これらの特徴を活かすことで、データの並び替えを安全かつ効率的に行うことができます。