Python での sort()と sorted()の違い
ソートは、コンピュータサイエンスの世界で非常に重要なトピックです。マージソート、クイックソート、バブルソート、選択ソート、挿入ソートなど、データの配列をソートするために使用できるアルゴリズムは多数あります。これらのアルゴリズムはすべて時間と空間の複雑さが異なりますが、一般にマージとクイックが最適と見なされます。ソートは非常に一般的な操作であるため、プログラミング言語にはデータをソートするための組み込み関数が含まれています。そして Python はその 1つです。
ただし、Python での並べ替えには、sort
と sorted
の 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
変数内に格納されている新しいリストが返されました。この関数では、reverse
と key
の 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}]