「pythonでリストの並び替えってどうやるの?」
「数字は簡単だけど、日本語や特殊な条件での並び替えは難しそう…」
今回はリストの並び替え(ソート)について、初心者の方でも理解できるように詳しく説明していきます。
pythonでは、たった1行のコードでリストを並び替えることができます。
しかも、昇順・降順・特定の条件に合わせた並び替えまで、とても柔軟に対応できるんです。
この記事を読めば、リストの並び替えを自在に操れるようになります。
リストの並び替えは2つの方法がある

pythonでリストを並び替える方法は、主に2つあります。
sort():元のリストを直接変更する
numbers = [3, 1, 4, 1, 5]
print("元のリスト:", numbers) # [3, 1, 4, 1, 5]
# リストを並び替える
numbers.sort()
print("並び替え後:", numbers) # [1, 1, 3, 4, 5]
sorted():新しいリストを作って返す
numbers = [3, 1, 4, 1, 5]
print("元のリスト:", numbers) # [3, 1, 4, 1, 5]
# 新しい並び替えられたリストを作る
new_list = sorted(numbers)
print("新しいリスト:", new_list) # [1, 1, 3, 4, 5]
print("元のリスト:", numbers) # [3, 1, 4, 1, 5] (変更されない)
どちらを使えば良いの?
使用場面 | おすすめの方法 | 理由 |
---|---|---|
元のリストがもう不要 | sort() | メモリ効率が良い |
元のリストも残したい | sorted() | 元のデータを保持できる |
一時的に並び替えたい | sorted() | 元のデータが安全 |
基本的な並び替え(昇順・降順)

昇順(小さい順)
デフォルトでは昇順(小さい順、あいうえお順)に並び替えられます。
# 数字の昇順
numbers = [5, 2, 8, 1, 9]
numbers.sort()
print(numbers) # [1, 2, 5, 8, 9]
# 文字列の昇順
fruits = ["バナナ", "りんご", "みかん"]
fruits.sort()
print(fruits) # ['みかん', 'りんご', 'バナナ']
降順(大きい順)
降順にしたい場合は、reverse=True
を指定します。
# 数字の降順
numbers = [5, 2, 8, 1, 9]
numbers.sort(reverse=True)
print(numbers) # [9, 8, 5, 2, 1]
# sorted()でも同じ
numbers = [5, 2, 8, 1, 9]
desc_numbers = sorted(numbers, reverse=True)
print(desc_numbers) # [9, 8, 5, 2, 1]
文字列のリストを並び替える
日本語の並び替え
fruits = ["バナナ", "りんご", "みかん", "いちご"]
fruits.sort()
print(fruits) # ['いちご', 'みかん', 'りんご', 'バナナ']
# 逆順
fruits.sort(reverse=True)
print(fruits) # ['バナナ', 'りんご', 'みかん', 'いちご']
英語の並び替え
words = ["apple", "banana", "cherry", "date"]
words.sort()
print(words) # ['apple', 'banana', 'cherry', 'date']
# 大文字小文字を区別しない並び替え
words = ["Apple", "banana", "Cherry", "date"]
words.sort(key=str.lower) # すべて小文字として比較
print(words) # ['Apple', 'banana', 'Cherry', 'date']
特殊な条件での並び替え(key引数)

key
引数を使うと、並び替えの基準を自由に設定できます。
key引数には、値を返す関数を指定する。
文字列の長さで並び替え
fruits = ["いちご", "スイカ", "パイナップル", "ぶどう"]
# 文字数の少ない順
fruits.sort(key=len)
print(fruits) # ['いちご', 'ぶどう', 'スイカ', 'パイナップル']
# 文字数の多い順
fruits.sort(key=len, reverse=True)
print(fruits) # ['パイナップル', 'スイカ', 'いちご', 'ぶどう']
絶対値で並び替え(負の数を含む場合)
numbers = [-3, 1, -5, 2, -1, 4]
# 絶対値の小さい順
numbers.sort(key=abs)
print(numbers) # [-1, 1, 2, -3, 4, -5]
最後の文字で並び替え
words = ["dog", "bat", "cat", "elephant"]
# 最後の文字で並び替え
words.sort(key=lambda x: x[-1])
print(words) # ['elephant', 'dog', 'cat', 'bat']
# 最後の文字:t, g, t, t → 辞書順でe, g, t, t
数字の特定の桁で並び替え
numbers = [123, 456, 789, 321, 654]
# 一の位で並び替え
numbers.sort(key=lambda x: x % 10)
print(numbers) # [321, 123, 654, 456, 789]
# 一の位:1, 3, 4, 6, 9の順
辞書のリストを並び替える

リストの中に辞書が入っている場合、特定のキーで並び替えることができます。
年齢で並び替え
users = [
{"name": "太郎", "age": 25},
{"name": "花子", "age": 18},
{"name": "次郎", "age": 30},
{"name": "美香", "age": 22}
]
# 年齢の若い順
users.sort(key=lambda x: x["age"])
print(users)
# [{'name': '花子', 'age': 18}, {'name': '美香', 'age': 22},
# {'name': '太郎', 'age': 25}, {'name': '次郎', 'age': 30}]
# 年齢の高い順
users.sort(key=lambda x: x["age"], reverse=True)
print(users)
# [{'name': '次郎', 'age': 30}, {'name': '太郎', 'age': 25},
# {'name': '美香', 'age': 22}, {'name': '花子', 'age': 18}]
名前で並び替え
users = [
{"name": "太郎", "age": 25},
{"name": "花子", "age": 18},
{"name": "次郎", "age": 30}
]
# 名前で並び替え
users.sort(key=lambda x: x["name"])
print(users)
# [{'name': '太郎', 'age': 25}, {'name': '次郎', 'age': 30}, {'name': '花子', 'age': 18}]
複数の条件で並び替え
複数の条件で並び替えたい場合は、タプルを使います。
students = [
{"name": "太郎", "class": "A", "score": 85},
{"name": "花子", "class": "B", "score": 90},
{"name": "次郎", "class": "A", "score": 90},
{"name": "美香", "class": "B", "score": 85}
]
# まずクラス、次に点数の高い順で並び替え
students.sort(key=lambda x: (x["class"], -x["score"]))
print(students)
# クラスA→B順、同じクラス内では点数の高い順
よくある間違いと注意点

異なる型の要素を並び替えようとする
# 間違い:数字と文字列が混在
mixed = [1, "2", 3, "4"]
# mixed.sort() # TypeError: '<' not supported between instances of 'str' and 'int'
# 正しい:型を統一する
mixed_str = ["1", "2", "3", "4"]
mixed_str.sort()
print(mixed_str) # ['1', '2', '3', '4']
# または数字に変換
mixed_int = [int(x) for x in ["1", "2", "3", "4"]]
mixed_int.sort()
print(mixed_int) # [1, 2, 3, 4]
sort()の戻り値を使おうとする
numbers = [3, 1, 4]
# 間違い:sort()は戻り値がNone
# result = numbers.sort() # resultはNone
# 正しい:sort()は元のリストを変更するだけ
numbers.sort()
print(numbers) # [1, 3, 4]
# または、sorted()を使う
numbers = [3, 1, 4]
result = sorted(numbers)
print(result) # [1, 3, 4]
Noneが含まれているリスト
# Noneが含まれていると比較できない場合がある
data = [3, None, 1, 4]
# エラーになる可能性
# data.sort() # TypeError
# Noneを除外してから並び替え
clean_data = [x for x in data if x is not None]
clean_data.sort()
print(clean_data) # [1, 3, 4]
実践的な使用例

成績順にランキングを作る
scores = [
{"name": "太郎", "score": 85},
{"name": "花子", "score": 92},
{"name": "次郎", "score": 78},
{"name": "美香", "score": 95}
]
# 点数の高い順に並び替え
scores.sort(key=lambda x: x["score"], reverse=True)
# ランキングを表示
for i, student in enumerate(scores, 1):
print(f"{i}位: {student['name']} ({student['score']}点)")
# 結果:
# 1位: 美香 (95点)
# 2位: 花子 (92点)
# 3位: 太郎 (85点)
# 4位: 次郎 (78点)
ファイル名を自然な順序で並び替え
filenames = ["file1.txt", "file10.txt", "file2.txt", "file20.txt"]
# 普通の並び替えだと文字列順になる
filenames.sort()
print(filenames) # ['file1.txt', 'file10.txt', 'file2.txt', 'file20.txt']
# 数字部分を取り出して並び替え
import re
def natural_sort_key(filename):
# 数字部分を抽出
numbers = re.findall(r'\d+', filename)
if numbers:
return int(numbers[0])
return 0
filenames.sort(key=natural_sort_key)
print(filenames) # ['file1.txt', 'file2.txt', 'file10.txt', 'file20.txt']
商品を価格帯で分類・並び替え
products = [
{"name": "商品A", "price": 1500},
{"name": "商品B", "price": 500},
{"name": "商品C", "price": 3000},
{"name": "商品D", "price": 800}
]
# 価格の安い順
products.sort(key=lambda x: x["price"])
# 価格帯で分類
budget = [] # 1000円未満
standard = [] # 1000円以上2000円未満
premium = [] # 2000円以上
for product in products:
if product["price"] < 1000:
budget.append(product)
elif product["price"] < 2000:
standard.append(product)
else:
premium.append(product)
print("お手頃価格:", [p["name"] for p in budget])
print("標準価格:", [p["name"] for p in standard])
print("高級価格:", [p["name"] for p in premium])
よくある質問
- Q文字列と数字が混在している場合はどうすれば良い?
- A
型を統一してから並び替えましょう。
mixed = ["10", "2", "1", "20"]
# 文字列として並び替え
print(sorted(mixed)) # ['1', '10', '2', '20']
# 数字として並び替え
print(sorted(mixed, key=int)) # ['1', '2', '10', '20']
- Qリストの一部だけを並び替えたい場合は?
- A
A:スライスを使って部分的に並び替えできます。
numbers = [1, 5, 2, 8, 3, 7, 4]
# 1番目から4番目までだけ並び替え
numbers[1:5] = sorte
- Q大文字小文字を区別しないで並び替えるには?
- A
A:
key=str.lower
を使います。words = ["Apple", "banana", "Cherry", "date"]
words.sort(key=str.lower)
- Q安定ソートって何?
- A
同じ値の要素の順序が保たれることです。pythonの
sort()
とsorted()
は安定ソートです。data = [("A", 1), ("B", 2), ("C", 1), ("D", 2)]
# 2番目の要素で並び替え
data.sort(key=lambda x: x[1])
print(data) # [('A', 1), ('C', 1), ('B', 2), ('D', 2)]
# 同じ値1同士、2同士の順序は保たれる
まとめ
pythonのリストの並び替えは、たった1行で強力なデータ処理ができる便利な機能です。
おさらい:
- 基本:
sort()
(元を変更)とsorted()
(新しいリスト) - 昇順・降順:
reverse=True
で降順に変更 - カスタムソート:
key
引数で並び替えの基準を指定 - 複雑な条件:ラムダ関数や複数条件での並び替え
コメント