Python sorted関数とは?並び替えの基本的な使い方
Python初心者向けにsorted関数の使い方を詳しく解説。リストやタプルの並び替え、逆順ソート、カスタムソートキーの使用方法を実例で説明します。
データの並び替えで困ったことはありませんか?
みなさん、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関数をマスターすることで、データの整理や分析がより効率的に行えるようになります。
まずは基本的な使い方から始めて、徐々にカスタムソートキーや複雑な条件でのソートにも挑戦してみてください!