リスト.sort() / リスト.reverse() / リスト.copy()
| 対応: | sort() / reverse() | Python 2(2000) |
|---|---|---|
| copy() | Python 3.3(2012) |
リストを並べ替えたり、順序を逆にしたり、コピーを作成するメソッドです。元のリストを直接変更する点が特徴です。
構文
# リストをその場でソートします(戻り値は None)。 リスト.sort(key=None, reverse=False) # リストの要素の順序を反転します(戻り値は None)。 リスト.reverse() # リストの浅いコピーを返します。 リスト.copy() # sorted() は元のリストを変更せず新しいリストを返します。 sorted(イテラブル, key=None, reverse=False)
関数一覧
| メソッド・関数 | 概要 |
|---|---|
| list.sort(key, reverse) | リストをその場で(in-place)ソートします。元のリストが変更されます。戻り値は None です。 |
| list.reverse() | リストの要素の順序をその場で逆転させます。元のリストが変更されます。戻り値は None です。 |
| list.copy() | リストの浅いコピー(shallow copy)を返します。list[:] と同じ効果です。 |
| sorted(iterable, key, reverse) | 元のイテラブルを変更せず、ソートされた新しいリストを返します。リスト以外にも使えます。 |
サンプルコード
sample_list_sort_reverse.py
# sort() でリストをその場でソートします。
nums = [3, 1, 4, 1, 5, 9, 2, 6]
nums.sort()
print(nums) # [1, 1, 2, 3, 4, 5, 6, 9]
# reverse=True で降順にソートします。
nums.sort(reverse=True)
print(nums) # [9, 6, 5, 4, 3, 2, 1, 1]
# key 関数を指定してカスタムソートします。
pilots = ["綾波レイ", "碇シンジ", "惣流アスカ", "渚カヲル"]
pilots.sort(key=len) # 文字列の長さでソートします。
print(pilots) # 文字数が少ない順に並びます。
# sort() の key に関数を指定する例です。
names = ["Vegeta", "son goku", "BULMA", "krillin"]
names.sort(key=str.lower) # 大文字・小文字を区別せずソートします。
print(names) # ['BULMA', 'krillin', 'son goku', 'Vegeta']
# 辞書のリストをキーでソートします。
students = [
{"name": "綾波レイ", "score": 92},
{"name": "碇シンジ", "score": 85},
{"name": "惣流アスカ", "score": 78},
]
students.sort(key=lambda s: s["score"])
print(students[0]["name"]) # 惣流アスカ(スコアが最も低い)
# reverse() でリストの順序を逆にします。
items = [1, 2, 3, 4, 5]
items.reverse()
print(items) # [5, 4, 3, 2, 1]
# copy() でリストのコピーを作成します。
original = [1, 2, 3]
copied = original.copy()
copied.append(4)
print(original) # [1, 2, 3](元のリストは変更されていません)
print(copied) # [1, 2, 3, 4]
# sorted() は元のリストを変更しません。
nums2 = [3, 1, 4, 1, 5]
sorted_nums = sorted(nums2)
print(nums2) # [3, 1, 4, 1, 5](変更なし)
print(sorted_nums) # [1, 1, 3, 4, 5](新しいリスト)
# 文字列のリストを sorted() でソートします。
result = sorted(["Son Goku", "Bulma", "Vegeta"])
print(result) # ['Bulma', 'Son Goku', 'Vegeta']
python3 list_sort_reverse.py [1, 1, 2, 3, 4, 5, 6, 9] [9, 6, 5, 4, 3, 2, 1, 1] ['綾波レイ', '碇シンジ', '渚カヲル', '惣流アスカ'] ['BULMA', 'krillin', 'son goku', 'Vegeta'] 惣流アスカ [5, 4, 3, 2, 1] [1, 2, 3] [1, 2, 3, 4] [3, 1, 4, 1, 5] [1, 1, 3, 4, 5] ['Bulma', 'Son Goku', 'Vegeta']
概要
『sort()』と『sorted()』の大きな違いは、元のリストを変更するかどうかです。『sort()』は元のリストをその場で変更し、戻り値は None です。ソート後のリストを新しい変数に代入しようとすると None が入ってしまいます。元のリストを保持したい場合は必ず『sorted()』を使ってください。
Pythonのソートアルゴリズムには Timsort が使われており、安定ソート(同じ値の要素の相対的な順序が保たれる)です。これにより、複数のキーで段階的にソートする(最初に名前でソート、次にスコアでソート)ようなことが期待通りに動作します。
『copy()』は浅いコピー(shallow copy)を作成します。リストの要素が別のリストや辞書などのオブジェクトの場合、そのオブジェクト自体はコピーされずに参照が共有されます。完全なコピーが必要な場合は『copy.deepcopy()』を使ってください。スライスによるコピーや結合については『リストのスライス』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。