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パラメータでソート基準のカスタマイズが可能
- 文字列、数値、タプルなど様々なデータ型に対応
これらの特徴を活かすことで、データの並び替えを安全かつ効率的に行うことができます。