Python での sort()と sorted()の違い

Vaibhav Vaibhav 2023年1月30日
  1. Python の sort() 関数
  2. Python の sorted() 関数
Python での sort()と sorted()の違い

ソートは、コンピュータサイエンスの世界で非常に重要なトピックです。マージソート、クイックソート、バブルソート、選択ソート、挿入ソートなど、データの配列をソートするために使用できるアルゴリズムは多数あります。これらのアルゴリズムはすべて時間と空間の複雑さが異なりますが、一般にマージとクイックが最適と見なされます。ソートは非常に一般的な操作であるため、プログラミング言語にはデータをソートするための組み込み関数が含まれています。そして Python はその 1つです。

ただし、Python での並べ替えには、sortsorted の 2つの関数があります。この記事では、これら 2つのソート機能の違いについて学習します。

Python の sort() 関数

Python の sort 関数は、インデックスの値を交換することにより、リストを所定の場所に並べ替えます。リストに対して sort 関数を呼び出すと、新しいリストは返されません。むしろ、同じリストがソートされます。sort() 関数を使用してリストを並べ替えることができます。

例については、次のコードを参照してください。

myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort()
print(myList)

出力:

[1, 5, 2, 10, 33, 3, 9]
[1, 2, 3, 5, 9, 10, 33]

ご覧のとおり、sort 関数を呼び出したときに同じリストが並べ替えられました。

リストを逆の順序で並べ替える場合は、reverse 引数を True に設定することもできます。

同じことについては、次のコードを参照してください。

myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort(reverse=True)
print(myList)

出力:

[1, 5, 2, 10, 33, 3, 9]
[33, 10, 9, 5, 3, 2, 1]

sort 関数には、さらに別のパラメーター、つまり key があります。これを使用して、ソートの対象となる値を定義できます。たとえば、ペアのリストがあり、2 番目の値を考慮してペアを並べ替えたい場合は、key パラメーターを使用してそれを行うことができます。

例については、次のコードを参照してください。

def secondElement(element):
    return element[1]


data = [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
print("Before sorting:", data)
data.sort(key=secondElement)
print("After sorting:", data)

出力:

Before sorting: [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
After sorting: [(3, 0), (10, 1), (1, 2), (5, 3), (3, 4), (6, 6)]

ご覧のとおり、リストはペア内の 2 番目の番号に基づいて並べ替えられています。

同じアプローチを使用して、辞書のリストを並べ替えることもできます。同じことについては、次のコードを参照してください。

def byName(entry):
    return entry["name"]


def byAge(entry):
    return entry["age"]


def byRank(entry):
    return entry["rank"]


data = [
    {
        "name": "Vaibhav",
        "age": 18,
        "rank": 1,
    },
    {
        "name": "Steve",
        "age": 24,
        "rank": 5,
    },
    {
        "name": "Olive",
        "age": 12,
        "rank": 2,
    },
    {
        "name": "Allison",
        "age": 17,
        "rank": 4,
    },
]

print("Original Data")
print(data)
print("Sorted by Name")
data.sort(key=byName)
print(data)
print("Sorted by Age")
data.sort(key=byAge)
print(data)
print("Sorted by Rank")
data.sort(key=byRank)
print(data)

出力:

Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]

ご覧のとおり、辞書のリスト内のエントリは、定義したキーに基づいて並べ替えられています。

Python の sorted() 関数

sort 関数と同様に、sorted はリストのソートにも使用されます。ただし、sorted 関数は、同じリストをその場でソートする代わりに、新しいリストを返します。これが 2つの機能の主な違いです。例を挙げてこれを理解しましょう。

myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList)
print("After called sorted():", myList)
print("New list:", newList)

出力:

Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [1, 2, 3, 5, 9, 10, 33]

ご覧のとおり、sorted 関数に渡したリストは同じままで、newList 変数内に格納されている新しいリストが返されました。この関数では、reversekey の 2つのパラメーターも使用できます。この 2つを使用すると、並べ替えられたリストを逆の順序で取得し、カスタムキーに基づいてリストを並べ替えることができます。次の例は同じことを示しています。

reverse パラメーターの例。

myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList, reverse=True)
print("After called sorted():", myList)
print("New list:", newList)

出力:

Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [33, 10, 9, 5, 3, 2, 1]

そして、key パラメータの例。

def byName(entry):
    return entry["name"]


def byAge(entry):
    return entry["age"]


def byRank(entry):
    return entry["rank"]


data = [
    {
        "name": "Vaibhav",
        "age": 18,
        "rank": 1,
    },
    {
        "name": "Steve",
        "age": 24,
        "rank": 5,
    },
    {
        "name": "Olive",
        "age": 12,
        "rank": 2,
    },
    {
        "name": "Allison",
        "age": 17,
        "rank": 4,
    },
]

print("Original Data")
print(data)
print("Sorted by Name")
nameSorted = sorted(data, key=byName)
print(nameSorted)
print("Sorted by Age")
ageSorted = sorted(data, key=byAge)
print(ageSorted)
print("Sorted by Rank")
rankSorted = sorted(data, key=byRank)
print(rankSorted)
print("Data after all operations")
print(data)

出力:

Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Data after all operations
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

関連記事 - Python Sorting