Pythonのタプルをソートする方法!並び替えの基本テクニックを紹介
生徒
「Pythonでタプルって並び替えできますか?」
先生
「はい、Pythonではタプル自体は変更できませんが、タプルのリストなどをソートする方法はありますよ。」
生徒
「タプルは変更できないんですよね?どうやって並び替えるんですか?」
先生
「では、実際にPythonでタプルを並び替える方法を具体例と一緒に見てみましょう!」
1. タプルとは?
Pythonのタプル(tuple)は、()(丸かっこ)で囲って複数の値をひとまとめにするデータ型です。例えば、(10, 20)のように、2つの数字を1つのタプルとして扱えます。
タプルは一度作ると中身を変更できないという特徴があり、データを安全に保つためによく使われます。
2. タプルのリストをソートする方法
タプルをソートするときは、タプルの入ったリストを作り、それを並び替える方法が一般的です。
Pythonにはsorted()という関数があり、リストを並び替えるときに便利です。
# タプルのリスト
points = [(3, 2), (1, 5), (4, 1)]
# ソート(1番目の要素で並び替え)
sorted_points = sorted(points)
print(sorted_points)
[(1, 5), (3, 2), (4, 1)]
最初の要素(左側)で昇順(小さい順)に並び替えられました。
3. 2番目の要素でソートしたいときは?
タプルの2番目や3番目の値で並び替えたいときは、sorted()に「キー(key)」を指定してあげます。
# 2番目の値(index=1)で並び替え
sorted_points = sorted(points, key=lambda x: x[1])
print(sorted_points)
[(4, 1), (3, 2), (1, 5)]
lambdaというのは、一時的に関数を作る簡単な書き方です。x: x[1]は「タプルの2番目の値」を使うという意味です。
4. 降順に並び替える方法
普通のsorted()は昇順(小さい順)ですが、降順(大きい順)にしたい場合は、reverse=Trueを指定します。
# 1番目の値で降順に並び替え
sorted_points = sorted(points, reverse=True)
print(sorted_points)
[(4, 1), (3, 2), (1, 5)]
また、2番目の要素で降順に並び替えるには、keyとreverseを一緒に使います。
sorted_points = sorted(points, key=lambda x: x[1], reverse=True)
print(sorted_points)
[(1, 5), (3, 2), (4, 1)]
5. ソート後に新しいリストとして使おう
sorted()は、元のリストを変更せずに新しい並び替え済みリストを返します。
元のタプルの順番を変えたくないときに便利です。
original = [(3, 2), (1, 5), (4, 1)]
new_sorted = sorted(original)
print("元のデータ:", original)
print("並び替え後:", new_sorted)
元のデータ: [(3, 2), (1, 5), (4, 1)]
並び替え後: [(1, 5), (3, 2), (4, 1)]
6. タプルの中に文字列がある場合もソートできる
タプルの中に文字列が含まれている場合も、Pythonでは問題なくソートできます。たとえば、名前と年齢のタプルなどです。
people = [("Tanaka", 25), ("Yamada", 20), ("Suzuki", 30)]
# 名前(1番目)でソート
sorted_by_name = sorted(people)
# 年齢(2番目)でソート
sorted_by_age = sorted(people, key=lambda x: x[1])
print(sorted_by_name)
print(sorted_by_age)
[('Suzuki', 30), ('Tanaka', 25), ('Yamada', 20)]
[('Yamada', 20), ('Tanaka', 25), ('Suzuki', 30)]
このように、文字列もアルファベット順で並び替えができます。
まとめ
タプルのソート方法を全体的に振り返ろう
この記事では、Pythonにおけるタプルの基本的な特徴から始まり、タプルをどのように並び替えるのかという点について、 具体的なサンプルとともに詳しく解説してきました。 タプルはリストとは異なり、一度作成すると中身を変更できないデータ型です。 そのため「タプルを直接ソートする」という考え方ではなく、 「タプルを要素として持つリストをソートする」という発想が重要になります。 この考え方を理解できると、Pythonのデータ構造全体への理解も一段深まります。
基本的な並び替えでは、sorted関数を使うことで、タプルのリストを簡単に昇順でソートできました。 何も指定しない場合は、タプルの先頭要素を基準にして比較が行われます。 これは、数値のタプルだけでなく、文字列を含むタプルであっても同じ仕組みです。 Pythonでは、左から順に要素を比較するルールがあるため、特別な設定をしなくても自然な順番で並び替えが行われます。
次に重要なのが、二番目以降の要素を基準にソートしたい場合の書き方です。 その際には、sorted関数のkey引数を使い、lambda式で基準となる要素を指定します。 lambdaは最初は難しく感じるかもしれませんが、「一時的に使う簡単な関数」と考えると理解しやすくなります。 タプルのインデックス番号を指定するだけで、柔軟な並び替えができる点は、 Pythonのタプルとソート処理の大きな強みと言えるでしょう。
さらに、reverseオプションを指定することで、降順での並び替えも簡単に行えることを学びました。 昇順と降順を切り替えられることで、点数の高い順、年齢の高い順、優先度の高い順など、 実際のプログラムでよくある要件にも対応できます。 また、sorted関数は元のリストを変更せず、新しいリストを返すという特徴があるため、 元データを保持したまま並び替え結果を使いたい場合にも安心して利用できます。
復習に最適なサンプルプログラム
ここで、タプルのソートに関する重要なポイントをまとめて確認できるサンプルプログラムを見てみましょう。 数値と文字列を含むタプルを扱いながら、昇順と降順の両方を確認できます。
data = [("A", 3), ("C", 1), ("B", 2)]
# 文字列で昇順ソート
sorted_by_name = sorted(data)
# 数値で昇順ソート
sorted_by_number = sorted(data, key=lambda x: x[1])
# 数値で降順ソート
sorted_by_number_desc = sorted(data, key=lambda x: x[1], reverse=True)
print(sorted_by_name)
print(sorted_by_number)
print(sorted_by_number_desc)
このように、タプルのソートは難しい処理を書かなくても、Pythonの標準機能だけで十分に対応できます。 データの並び替えは、集計処理や表示順の制御など、さまざまな場面で必要になります。 今回学んだ内容をしっかり理解しておくことで、実践的なプログラムを書く際にも迷いが少なくなるでしょう。
生徒
「タプルは変更できないから難しいと思っていましたが、 リストとしてまとめてソートすればいいと分かって、すごく納得できました。」
先生
「とても良い理解ですね。タプルの性質を正しく知っていれば、 無理に変更しようとせず、適切な方法を選べるようになります。」
生徒
「keyやlambdaを使うと、並び替えの自由度が一気に広がるのも面白かったです。」
先生
「その感覚は大切です。タプルのソートは、Pythonらしいシンプルな書き方を学ぶ良い題材なので、 ぜひ他のデータでも試してみてください。」
生徒
「これからは、タプルとsortedを組み合わせて、データ整理をもっと楽にできそうです。」