sort() と sorted() の比較

# `sort()` と `sorted()` の使用用途を比較してみる
参考書ベースに学んでいて、ふとした時にソートしたリストってなんでNoneになってるの？と先走りしながら迷走してました！`sorted()`に関してはもちろん記載があったのですが、どう違うのか疑問が浮かんだのでちょっと書き起こしておきました！

## 1. 使用方法

### `sort()`
- **インプレース（その場で）ソート**を行い、元のリストを変更するメソッド
- **戻り値は `None`**
    - リスト自体が変更されるため、明示的に新しいリストを返却しない
- リスト専用のメソッドであり、他のデータ構造（タプルや辞書、セット）には使用できない

```python
menu = [3, 1, 4, 1, 5]
menu.sort()  # menuがその場でソートされる
print(menu)  # [1, 1, 3, 4, 5]
```

### `sorted()`
- 新しいソート済みリストを返す関数で、元のリストは変更されない
- 元のリストを保持したまま、ソートされた結果を新しい変数として使用できる
- リストだけでなく、タプル、辞書、セットなどの反復可能オブジェクトにも使用可能

```python
menu = [3, 1, 4, 1, 5]
sorted_menu = sorted(menu)  # 新しいリストが返される
print(sorted_menu)  # [1, 1, 3, 4, 5]
print(menu)  # 元のリストは変更されない [3, 1, 4, 1, 5]
```

## 2. `sort()` と `sorted()` の違い

- `sort()`
　リストのデータそのものをソートしてしまうため、元のリストを使い回すことができない代わりに、メモリ効率が良いという特徴があります。例えば、大規模なデータセットや、リストの破壊的な変更を許容する場合に有効です。
- `sorted()`
　元のデータを保持しながら新しいリストを返すので、複数のソート結果を扱いたい場面や、元のデータを何度も参照したい場合に便利です。ただし、新しいリストを作成するため、メモリを余分に使用する点に注意が必要です。

| 特徴                     | `sort()`                                     | `sorted()`                                   |
|------------------------|---------------------------------------------|---------------------------------------------|
| 変更方法                | リスト自体を直接変更                         | 新しいリストを返す                           |
| メモリ効率              | メモリ効率が良い                             | 元のリストを保持するため、メモリを追加使用する |
| 対応データ型            | リストオブジェクト専用                       | イテラブル全般（リスト、タプル、辞書など）  |
| 元のデータの保持        | 元のリストの順序を変更                       | 元のリストは変更されない                     |
| 使用シナリオ            | 大規模なリストを効率的に並べ替えたい場合   | 一時的にデータを並べ替えたい場合            |







## 3. 適した使用場面
### sort() が適している場面
1.　メモリ効率が重要な場合

sort() は元のリストを直接変更するため、大規模なデータセットでメモリ使用量を抑えたいときに有効です。
```python
コードをコピーする
large_list = [3, 1, 4, 1, 5] * 1000000
large_list.sort()  # メモリ効率を重視
```

2.　リストの破壊的な変更が許容される場合

元のリストをそのままソートして使用したい場合、sort() は簡単で効率的な方法です。新しいリストを作成する必要がなく、元のリストがその場でソートされます。
```python
コードをコピーする
data = [5, 2, 9, 1]
data.sort()  # 元のリストをそのまま変更
print(data)  # [1, 2, 5, 9]
```

3.　ループや再帰的な処理の中で使用する場合

破壊的な変更が発生しても問題ない場合や、処理のパフォーマンスを優先する場合に、インプレースソートである sort() が適しています。

### sorted() が適している場面
1.　元のリストを保持したい場合

sorted() は元のリストを保持したまま、新しいソート済みリストを返すため、元データを変更せずに処理を行いたい場合に便利です。
```python
コードをコピーする
menu = [3, 1, 4, 1, 5]
sorted_menu = sorted(menu)  # 元のリストを保持しつつソート結果を使用
```

2.　複数のソート結果を得たい場合

sorted() を使うと、異なるソート順（昇順や降順など）の結果を別々に扱うことができます。元データを何度もソートする際に便利です。
```python
コードをコピーする
menu = [3, 1, 4, 1, 5]
asc = sorted(menu)  # 昇順
desc = sorted(menu, reverse=True)  # 降順
```

3.　リスト以外の反復可能オブジェクトをソートする場合

sorted() はリスト以外にもタプルや辞書、セットといったデータ構造に対応しています。そのため、他のデータ型をソートする必要がある場合に sorted() が役立ちます。
```python
コードをコピーする
tup = (3, 1, 4)
sorted_tup = sorted(tup)  # [1, 3, 4]
```

4.　関数の引数として使用する場合

sorted() は関数形式であり、リスト以外の引数にも柔軟に対応できるため、他の関数に組み合わせやすい特徴があります。
```python
コードをコピーする
def process_data(data):
    return sorted(data)  # ソート済みデータを関数内で使用

print(process_data([3, 5, 1, 4]))
```

## 4. まとめ
### sort() と sorted() の使い分け
- `sort()`
    - **リスト自体を直接変更する**
    - リストを並べ替える際、追加のメモリを消費しないので、メモリ効率が良い
    - リストオブジェクト専用で、**リスト以外のデータ型には使用できない**
    - 元のリストを変更するため、元の順序を保持したい場合には適していない
    - 大規模なリストを効率的に並べ替えたい場合やメモリ効率を重視する際に使用する
- `sorted()`
    - 新しいリストを返却するので、**元のリストは変更されない**
    - イテラブル全般に対応しており、**他のデータ構造にも使用可能**
    - 関数内でリストを処理したり、元のリストを保持しつつ異なる順序で操作したい場面で便利
    - 一時的にデータを並べ替えたい場合や、元のデータを保持したい場合に適している

このように、`sort()` と `sorted()` にはそれぞれの特性があるため、目的や状況に応じて使い分けることが重要になってきそうです！


## おわりに
`sort()`を初めに使用して時になんで変数に入れ込めないのか...と弄っていたら参考書の次の項目に`sorted()`の使用方法書いてあって、バカやったなーと思いながら。毎度のことながら比較したい性分なのでちょっとドキュメントとして見返せるようにしてみました。なるほど。

## 参考
- Python【完全】入門 （[Kindle](https://www.amazon.co.jp/Python%EF%BC%BB%E5%AE%8C%E5%85%A8%EF%BC%BD%E5%85%A5%E9%96%80-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E-ebook/dp/B08KT6XZMQ/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2HYK2LQLD7QIQ&dib=eyJ2IjoiMSJ9.-5terBMPegbSXkfTx5dVqakvy9Yp5R35lIFt_1IqG3DoAOUhqOjQAHDRYCGRT6Q69-G_t2F3Fw3SQ2glN4shB0DAXYjqPgRrKYYPZluxpxW4OFWL4C-rPv46R7z2XcDh2kCZ_Q_A16Lzom9PZeMbsUgC4v8tlaQTVCDuAULmLiR4Ho-4KIzpeA8dr079nbob66tttaE7TndNt9EhZ2k0wrnTxLGIjLQHuVyCmb5Qgu4.LBOgSf840uP5wg3c3Mop9uDpZ3-d583OokvC6oxDhV0&dib_tag=se&keywords=python+%E5%AE%8C%E5%85%A8+%E5%85%A5%E9%96%80&qid=1729650552&s=digital-text&sprefix=python+%E5%AE%8C%E5%85%A8+%E5%85%A5%E9%96%80%2Cdigital-text%2C157&sr=1-1)）
- [【2024】Pythonのsorted()関数を徹底解説！sort()との違いやカスタムキーを使ったソートまで解説")](https://ai-kenkyujo.com/programming/python/sort/)