Sắp xếp phần tử trong list python | Laptrinhcanban.com

HOME › >>

Sắp xếp phần tử trong list python

Hướng dẫn cách sắp xếp phần tử trong list python. Trong lập trình Python, việc sắp xếp các phần tử trong list là một tác vụ quan trọng và thường xuyên xuất hiện. Sắp xếp dữ liệu giúp chúng ta tìm kiếm, truy cập và sử dụng dữ liệu một cách hiệu quả. Python cung cấp nhiều cách để sắp xếp list, bao gồm sắp xếp tăng dần và giảm dần. Trong bài viết này, chúng ta sẽ tìm hiểu về các phương pháp sắp xếp list trong Python và các trường hợp sử dụng phổ biến của chúng.

Sắp xếp phần tử trong list python theo thứ tự tăng dần

Sử dụng hàm sorted()

Chúng ta sắp xếp phần tử trong list theo thứ tự tăng dần bằng hàm sorted() trong Python. Hàm sorted() trả về một list mới được sắp xếp mà không làm thay đổi list gốc.

Cú pháp sắp xếp list bằng hàm orted() như sau:

new_list = sorted ( org_list , * , key = None, reverse = False )

Bạn cũng có thể lược bỏ đi phần lớn đối số và chỉ dùng đối số org_list như cú pháp sau đây. Thực tế đây cũng là cách viết được sử dụng thông dụng nhất.

new_list = sorted ( org_list)

Lại nữa, chúng ta cũng có thể dùng hàm sorted() không những với list, mà còn với các iterable khác như chuỗi ký tự, tuple v.v… Do dó bạn cũng có thể thay thế đối số org_list bằng chuỗi_cũ hoặc tuple_cũ hay bất cứ dạng dữ liệu nào có chứa phần tử mà bạn cần sắp xếp.

Điều duy nhất cần chú ý là, bản thân đối số bạn chỉ định không thay đổi, list thì vẫn là list, tuple thì vẫn là tuple, chuỗi thì vẫn là chuỗi. Nhưng kết quả trả về sẽ luôn là một list mới. Cần chú ý nhé, không lại thắc mắc vì sao đưa một chuỗi ký tự đi sắp xếp mà kết quả trả về lại thành ra là list.

Để dễ hiểu hơn, hãy xem ví dụ sau đây, chúng ta sẽ sử dụng hàm sorted() trong python như sau:

my_list = [4, 1, 3, 6, 2, 5]
sorted_list = sorted(my_list)
print(sorted_list)

Kết quả là list đã sắp xếp:

[1, 2, 3, 4, 5, 6]

Bạn có thể thấy, một list mới đã được tạo ra từ my_list với các phần tử được xắp xếp lại theo thứ tự tăng dần rồi phải không?

Sử dụng phương thức sort()

Ngoài hàm sorted(), chúng ta cũng có thể sắp xếp phần tử trong list python theo thứ tự tăng dần bằng phương thức sort() với cú pháp đơn giản như dưới đây.

list.sort()

Phương thức sort() trong python sẽ sắp xếp lại phần tử trong chính list ban đầu theo thứ tự ban đầu. Lưu ý là bản thân list ban đầu được sắp xếp lại, chứ không có list mới nào được tạo ra.

Ví dụ cụ thể :

my_list = [4, 1, 3, 6, 2, 5]
my_list.sort(reverse=True)
print(my_list)

Kết quả sẽ là list đã sắp xếp theo thứ tự giảm dần:

[6, 5, 4, 3, 2, 1]

Sắp xếp phần tử trong list python theo thứ tự giảm dần

Theo mặc định thì hàm sorted() hay phương thức sort() sẽ sắp xếp list theo thứ tự tăng dần. Do đó nếu bạn muốn sắp xếp phần tử trong list python theo thứ tự tăng dần, thì bạn viết hàm và phương thức theo mặc định như Kiyoshi đã hướng dẫn ở phần trên.

Ngược lại nếu bạn muốn sắp xếp phần tử trong list python theo thứ tự giảm dần, hãy sử dụng hàm Hàm sorted() hoặc Phương thức sort() với tham số reverse.

Phương thức sort() với tham số reverse

Nếu bạn muốn sắp xếp list theo thứ tự giảm dần, bạn có thể sử dụng tham số reverse=True trong phương thức sort():

my_list = [4, 1, 3, 6, 2, 5]
my_list.sort(reverse=True)
print(my_list)

Kết quả sẽ là list đã sắp xếp theo thứ tự giảm dần:

[6, 5, 4, 3, 2, 1]

Sắp xếp ngược list với hàm sorted()

Tương tự như phương thức sort(), bạn cũng có thể sắp xếp list theo thứ tự giảm dần bằng cách sử dụng tham số reverse=True trong hàm sorted():

my_list = [4, 1, 3, 6, 2, 5]
sorted_list = sorted(my_list, reverse=True)
print(sorted_list)

Kết quả là list đã sắp xếp theo thứ tự giảm dần:

[6, 5, 4, 3, 2, 1]

Sắp xếp list với key function

Ở phần trên chúng ta đã học cách sắp xếp phần tử bằng cách sử dụng trực tiếp giá trị của các phần tử trong list. Ngoài cách này, chúng ta cũng có thể dùng giá trị của các phần tử này như là một đối số cho một hàm hoặc phương thức thứ ba, sau đó lấy giá trị thu về để tiến hành sắp xếp phần tử.

Cách làm này đặc biệt hữu dụng khi bạn muốn quyết định cách sắp xếp list của mình không dựa theo giá trị của phần tử, mà dựa vào độ dài của chuỗi ký tự tạo nên phần tử , giá trị tuyệt đối của phần tử v.v…

Sử dụng với hàm sorted

Để chỉ định hàm hoặc phương thức để biến đổi giá trị trong list trước khi đem đi sắp xếp, chúng ta sử dụng tới tham số key function trong hàm sorted() với cú pháp như sau:

new_list = sorted ( org_list, key = func_name)

Trong đó, chúng ta có thể chỉ định các hàm hoặc phương thức sau dấu bằng như hàm abs(), hàm len(), hoặc phương thức upper() chẳng hạn v.v…

Hãy cùng xem các ví dụ cụ thể dưới đây:

VD1: Sắp xếp phần tử trong list python theo độ dài của chuỗi ký tự tạo thành phần tử trong chuỗi
Chúng ta sẽ chỉ định tên hàm sử dụng là len : hàm giúp tìm độ dài của chuỗi ký tự tạo nên phần tử trong list.
Bạn có thể tham khảo thêm về hàm len trong bài viết tìm độ dài của List python

mylist = ["apple", "pen", "desk", "banana"]

sorted(mylist)
#>> ['apple', 'banana', 'desk', 'pen']

sorted(mylist, key=len)
#>> ['pen', 'desk', 'apple', 'banana']

VD2: Sắp xếp phần tử trong list python theo giá trị tuyệt đối của phần tử trong chuỗi
Chúng ta cần chỉ định tên hàm sử dụng là abs : hàm giúp đưa ra giá trị tuyệt đối, giống như ví dụ sau:

mylist = [5, -4, -7, 6]

sorted(mylist)
#>> [-7, -4, 5, 6]

sorted(mylist, key=abs)
#>> [-4, 5, 6, -7]

VD3: Sắp xếp phần tử trong list python theo giá trị được chuyển thành chữ thường của phần tử trong chuỗi
Chúng ta cần chỉ định tên phương thức sử dụng là str.lower : phương thức giúp chuyển đổi một chuỗi ký tự thành chữ thường.

Bạn có thể tham khảo thêm về hàm len trong bài viết Phương thức Lower() trong Python.

Ví dụ:

animallist = ["Cat", "monkey", "bear", "Sheep", "cow"]

sortlist = sorted(animallist)
lowersortlist = sorted(animallist, key=str.lower)

print(animallist)
#>> ['Cat', 'monkey', 'bear', 'Sheep', 'cow']

print(sortlist)
#>> ['Cat', 'Sheep', 'bear', 'cow', 'monkey']

print(lowersortlist)
#>> ['bear', 'Cat', 'cow', 'monkey', 'Sheep']

Ngoài ra, bạn cũng có thể sử dụng hầu hết các phương thức xử lý chuỗi để chỉ định cho key function. Tham khảo các phương thức này tại chuyên đề Chuỗi string trong python.

Sử dụng với phương thức sort()

Tương tự, bạn có thể sử dụng phương thức sort() với key function:

my_list = ["apple", "banana", "cherry", "date", "fig"]
my_list.sort(key=lambda x: len(x))
print(my_list)

Kết quả là list các chuỗi đã sắp xếp theo độ dài:

['fig', 'date', 'apple', 'cherry', 'banana']

Sắp xếp list sử dụng phương thức sort() và sorted() với key function và reverse

Bạn có thể kết hợp cả key function và reverse khi sắp xếp list:

my_list = ["apple", "banana", "cherry", "date", "fig"]
sorted_list = sorted(my_list, key=lambda x: len(x), reverse=True)
my_list.sort(key=lambda x: len(x), reverse=True)
print(sorted_list)
print(my_list)

Kết quả sẽ là list các chuỗi đã sắp xếp theo độ dài giảm dần:

['banana', 'cherry', 'apple', 'date', 'fig']
['banana', 'cherry', 'apple', 'date', 'fig']

Sắp xếp list với phương thức sort() và sorted() sử dụng key function và multiple keys

Python cho phép bạn sắp xếp list dựa trên nhiều key function, tức là bạn có thể xác định nhiều tiêu chí sắp xếp.

Ví dụ, để sắp xếp list các từ theo chiều tăng dần của độ dài, và nếu có cùng độ dài thì sắp xếp theo bảng chữ cái:

my_list = ["apple", "banana", "cherry", "date", "fig", "grape", "kiwi"]
sorted_list = sorted(my_list, key=lambda x: (len(x), x))
my_list.sort(key=lambda x: (len(x), x))
print(sorted_list)
print(my_list)

Kết quả sẽ là list các từ đã sắp xếp theo độ dài tăng dần và sau đó theo bảng chữ cái:

['date', 'fig', 'kiwi', 'apple', 'cherry', 'banana', 'grape']
['date', 'fig', 'kiwi', 'apple', 'cherry', 'banana', 'grape']

Một số phương pháp sắp xếp phần tử khác

Phương pháp Bubble Sort

Bubble Sort là một trong những thuật toán sắp xếp đơn giản nhất và cũng là một trong những thuật toán chậm nhất. Thuật toán Bubble Sort hoạt động bằng cách so sánh lần lượt từng cặp phần tử liền kề và hoán đổi chúng nếu cần thiết cho đến khi list được sắp xếp.

Ví dụ về Bubble Sort:

def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]

my_list = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(my_list)
print(my_list)

Kết quả là list đã sắp xếp:

[11, 12, 22, 25, 34, 64, 90]

Phương pháp Quick Sort

Quick Sort là một thuật toán sắp xếp nhanh và hiệu quả. Nó hoạt động bằng cách chọn một phần tử pivot và chia list thành hai phần, một phần chứa các phần tử nhỏ hơn pivot và một phần chứa các phần tử lớn hơn pivot. Sau đó, thuật toán sử dụng đệ quy để sắp xếp cả hai phần đó.

Ví dụ về Quick Sort:

def quick_sort(arr):
if len(arr) <= 1:
return arr
else:
pivot = arr[0]
less = [x for x in arr[1:] if x <= pivot]
greater = [x for x in arr[1:] if x > pivot]
return quick_sort(less) + [pivot] + quick_sort(greater)

my_list = [64, 34, 25, 12, 22, 11, 90]
sorted_list = quick_sort(my_list)
print(sorted_list)

Kết quả là list đã sắp xếp:

[11, 12, 22, 25, 34, 64, 90]

Lưu ý khi sắp xếp list chứa các phần tử có kiểu dữ liệu khác nhau

Ở phần trên, chúng ta đã học cách sắp xếp các phần tử trong list python, nếu list đó chỉ gồm toàn các phần tử giống nhau, như toàn là số, hoặc chuỗi ký tự rồi. Vậy khi kiểu dữ liệu của các phần tử trong list khác nhau, chúng ta cần làm thế nào?

Câu trả lời ở đây là, nếu các phần tử trong list khác kiểu dữ liệu nhưng vẫn so sánh được, thì chúng ta có thể sắp xếp list như bình thường với hàm sorted() hoặc phương thức sort(). Ví dụ như bạn muốn sắp xếp số nguyên với số thực hay số phức chẳng hạn. Giống như ví dụ sau đây:

#Sắp xếp list gồm số nguyên và số thực.
numlist = [5, 3.14, 4,78, 4]

newnumlist = sorted (numlist)
print (newnumlist)
#>> [3.14, 4, 4, 5, 78]

Nhưng nếu bạn muốn sắp xếp một list gồm các phần tử có kiểu dữ liệu khác nhau và chúng cũng không thể so sánh với nhau, ví dụ như chữ số và số chẳng hạn, thì nếu bạn dùng hàm sorted() thì lỗi TypeError sẽ xảy ra như dưới đây:

mylist = ["80", 75, 45, "68"]
newmylist = sorted(mylist)

Kết quả trả về lỗi:

Traceback (most recent call last):
File "Main.py", line 2, in <module>
newmylist = sorted(mylist)
TypeError: '<' not supported between instances of 'int' and 'str'

Sự khác biệt giữa sorted(list) vs list.sort() trong python

Mặc dù chúng ta đều sử dụng sorted(list) lẫn list.sort() để sắp xếp phần tử trong list theo thứ tự tăng dần, tuy nhiên hai phương pháp này có điểm khác biệt cực kỳ lớn đó là :

  • Hàm sorted() không thay đổi list ban đầu mà tạo ra một list mới được sắp xếp lại từ list ban đầu.
  • Phương thức sort() không tạo ra list mới mà chỉ sắp xếp lại chính list ban đầu.

Cũng cần phải lưu ý thêm nữa, vốn dĩ khái niệm hàmphương thức cũng đã khác nhau về bản chất, cách sử dụng rồi.

Tóm lại, bạn dùng hàm sorted() khi cần tạo ra một list mới. Ngược lại trong trường hợp không cần tạo một list mới, thì bạn sẽ dùng phương thức sort() để xắp xếp phần tử trong list python.

Sau đây chúng ta sẽ so sánh list.sort() với sorted(list) trong python bằng các ví dụ cụ thể nhé:

Sắp xếp một list có phần tử là số:

#Sử dụng sorted(list)
numlist = [84, 75, 92, 90, 78]
newnumlist = sorted(numlist)
print(newnumlist)
##> [75, 78, 84, 90, 92]

#Sử dụng list.sort()
numlist = [84, 75, 92, 90, 78]
numlist.sort()
print(numlist)
##> [75, 78, 84, 90, 92]

Sắp xếp một list có phần tử là chữ:

#Sử dụng sorted(list)
colorlist = ["Blue", "Red", "Green", "White", "Black"]
newwcolor = sorted(colorlist)
print(newwcolor)
#>> ['Black', 'Blue', 'Green', 'Red', 'White']

#Sử dụng list.sort()
colorlist = ["Blue", "Red", "Green", "White", "Black"]
colorlist.sort()
print(colorlist)
#>> ['Black', 'Blue', 'Green', 'Red', 'White']

Nhược điểm của cách sắp xếp dùng hàm sorted() hoặc phương thức sort() trong python

Mặc dù hai cách này rất dễ sử dụng và có thể sắp xếp đúng ở hầu hết trường hợp, tuy nhiên trong một số trường hợp thì hàm sorted() hoặc phương thức sort() cũng chưa thể đưa ra kết quả sắp xếp tự nhiên nhất, giống như ví dụ dưới đây:

a = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in']
sorted(a)
print(a)
#>>['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in']

Kết quả chúng ta muốn đó là:

['1 ft 5 in', '2 ft 7 in', '2 ft 11 in', '7 ft 6 in', '10 ft 2 in']

Tuy nhiên như ví dụ trên, hàm sorted() chưa đưa ra được kết quả như chúng ta mong muốn.

Trong trường hợp này, chúng ta cần phải sử dụng một hàm số khác vốn không được tích hợp sẵn khi bạn cài đặt python, đó là natsort - hàm sắp xếp tự nhiên. Hàm này không được tích hợp mặc định khi bạn cài đặt python hoặc dùng python trên Anaconda , mà bạn cần phải cài nó với lệnh pip install natsort, sau đó import nó ra thì mới sử dụng được. Chúng ta sẽ cùng học về hàm này ở một bài học khác nhé.

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách sắp xếp phần tử trong list python rồi. Sắp xếp phần tử trong list Python là một kỹ năng quan trọng trong lập trình. Python cung cấp nhiều cách để sắp xếp list, từ sử dụng phương thức sort() đơn giản đến việc sử dụng các thuật toán sắp xếp phức tạp như Quick Sort. Sự lựa chọn của bạn phụ thuộc vào tình huống cụ thể và yêu cầu của dự án. Điều quan trọng là hiểu rõ cách mà mỗi phương pháp hoạt động để có thể áp dụng chúng một cách hiệu quả trong ứng dụng của bạn.

URL Link

https://laptrinhcanban.com/python/nhap-mon-lap-trinh-python/list-trong-python/sap-xep-phan-tu-trong-list-python/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.