【初心者向け】Pythonでリストを並び替える方法|基本から応用まで

python

「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引数で並び替えの基準を指定
  • 複雑な条件:ラムダ関数や複数条件での並び替え

コメント

タイトルとURLをコピーしました