Sắp xếp list là một thao tác cơ bản và thường xuyên được sử dụng trong lập trình Python. Bài viết này sẽ giới thiệu một phần về các cách thức sắp xếp list trong Python, bao gồm việc sử dụng các phương thức sort() và sorted() cũng như giúp bạn hiểu rõ hơn về cú pháp, cách sử dụng, cũng như khám phá các kỹ thuật nâng cao hơn như sử dụng hàm callback.
Các điểm chính
Khi đọc xong bài viết, bạn sẽ:
- Hiểu rõ khái niệm và tầm quan trọng: Nắm vững kiến thức cơ bản về sắp xếp list (danh sách) trong Python, hiểu tại sao việc sắp xếp list lại quan trọng trong lập trình.
- Sử dụng thành thạo phương thức
sort()
: Biết cách sử dụng phương thứcsort()
để sắp xếp list trực tiếp (in-place), bao gồm cú pháp và cách áp dụng với các ví dụ cụ thể về sắp xếp theo thứ tự từ điển và thứ tự toán học. - Sử dụng hiệu quả hàm sorted(): Hiểu cách sử dụng hàm
sorted()
để tạo ra một list mới đã được sắp xếp từ một list ban đầu, bao gồm cú pháp và ví dụ minh họa. - Áp dụng hàm Callback để tùy biến sắp xếp: Làm chủ kỹ thuật sử dụng hàm callback (hàm gọi lại) với tham số key để tùy biến cách sắp xếp list, thông qua các ví dụ như sử dụng
str.lower()
để sắp xếp không phân biệt chữ hoa chữ thường, hoặc sử dụng hàm tự định nghĩa để sắp xếp theo logic riêng.
Sắp xếp list trong Python
Sắp xếp List trong Python là quá trình bố trí các phần tử của List theo thứ tự tăng dần hoặc giảm dần, dựa trên một tiêu chí đã được xác định, chẳng hạn như thứ tự số học hoặc thứ tự từ điển.

Có thể thực hiện việc sắp xếp này bằng cách sử dụng hàm có sẵn sorted()
hoặc bằng cách gọi phương thức sort()
trực tiếp trên List. Cả hai cách này đều có thể thay đổi List gốc hoặc trả về một List mới đã được sắp xếp, tùy thuộc vào phương thức được sử dụng.
Sắp xếp list trong Python với phương thức sort()
Phương thức sort()
trong Python được sử dụng để sắp xếp các phần tử của một List ngay tại chỗ (in place). Điều này có nghĩa là phương thức này sẽ thay đổi trực tiếp List gốc mà không tạo ra một List mới.
Cú Pháp
Cú pháp để sử dụng phương thức sort()
như sau:
tên_list.sort(key=None, reverse=False)
Trong đó:
tên_list
là tên của List cần được sắp xếp.- key (tùy chọn): là một hàm xác định tiêu chí sắp xếp. Nếu được cung cấp, hàm này sẽ được áp dụng cho từng phần tử của List để phục vụ cho việc sắp xếp. Giá trị mặc định là
None
. - reverse (tùy chọn): là một giá trị boolean. Nếu là
True
, List sẽ được sắp xếp theo thứ tự giảm dần. Nếu làFalse
(mặc định), List sẽ được sắp xếp theo thứ tự tăng dần.
Ví dụ về sắp xếp list theo thứ tự từ điển
Trong ví dụ sau, chúng ta sẽ sử dụng hàm sort()
để sắp xếp các mục của List theo thứ tự chữ cái:
trai_cay = ['xoai', 'tao', 'chuoi', 'dua']
print ("List ban dau:", trai_cay)
trai_cay.sort()
print ("List sau khi sap xep: ", trai_cay)
Kết quả đầu ra:
List ban dau: [‘xoai’, ‘tao’, ‘chuoi’, ‘dua’]
List sau khi sap xep: [‘chuoi’, ‘dua’, ‘tao’, ‘xoai’]
Giải thích code:
- Khai báo một List tên
trai_cay
chứa các chuỗi là tên các loại trái cây: print("List ban dau:", trai_cay)
: In ra List ban đầu trước khi sắp xếp.trai_cay.sort()
: Câu lệnhtrai_cay.sort()
gọi phương thứcsort()
trên Listtrai_cay
. Vì không truyền tham số nào,sort()
sẽ mặc định sắp xếp các phần tử theo thứ tự tăng dần (trong trường hợp chuỗi là theo thứ tự từ điển bảng chữ cái).print("List sau khi sap xep: ", trai_cay)
: In ra List sau khi đã được sắp xếp. Như bạn thấy, các phần tử đã được sắp xếp theo thứ tự alphabet: ‘chuoi’, ‘dua’, ‘tao’, ‘xoai’.
Lưu ý: Phương thức sort()
thay đổi trực tiếp List gốc, nên sau khi gọi sort()
List trai_cay đã bị thay đổi.
Ví dụ về sắp xếp list theo thứ tự toán học
Trong ví dụ này, chúng ta sử dụng hàm sort()
để sắp xếp một List số theo thứ tự số học (tăng dần):
diem_so = [75, 90, 62, 85, 58]
print("List ban dau:", diem_so)
diem_so.sort()
print("List sau khi sap xep:", diem_so)
Kết quả đầu ra sẽ là:
List ban dau: [75, 90, 62, 85, 58]
List sau khi sap xep: [58, 62, 75, 85, 90]
Giải thích code:
- Một List có tên
diem_so
được tạo ra: chứa các số nguyên là điểm số. print("List ban dau:", diem_so)
: In ra List ban đầu, trước khi thực hiện sắp xếp.diem_so.sort()
: Phương thứcsort()
được gọi mà không có tham số. Trong trường hợp List chứa các số,sort()
mặc định sẽ sắp xếp theo thứ tự tăng dần.print("List sau khi sap xep:", diem_so)
: In ra Listdiem_so
sau khi đã được sắp xếp. Bạn có thể thấy các số đã được sắp xếp từ nhỏ đến lớn: 58, 62, 75, 85, 90.
Sắp xếp list trong Python với phương thức sorted()
Hàm sorted()
trong Python là một hàm có sẵn (built-in function) dùng để sắp xếp các phần tử của một iterable (chẳng hạn như List, tuple, hoặc chuỗi) và trả về một List mới đã được sắp xếp, trong khi vẫn giữ nguyên iterable ban đầu, không thay đổi.
Cú Pháp
Cú pháp sử dụng phương thức sorted()
như sau:
sorted(iterable, key=None, reverse=False)
Trong đó:
- iterable là iterable (ví dụ: List, tuple, string) chứa các phần tử cần được sắp xếp.
- key (tùy chọn) là một hàm xác định tiêu chí sắp xếp. Nếu được cung cấp, hàm này sẽ được áp dụng cho mỗi phần tử của iterable để phục vụ cho việc sắp xếp. Mặc định là
None
. - reverse (tùy chọn) là một giá trị boolean. Nếu là
True
, iterable sẽ được sắp xếp theo thứ tự giảm dần. Nếu làFalse
(mặc định), iterable sẽ được sắp xếp theo thứ tự tăng dần.
Ví dụ
Trong ví dụ sau, chúng ta sử dụng hàm sorted()
để sắp xếp một List các số và thu về một List mới đã được sắp xếp:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
# Sắp xếp theo thứ tự giảm dần
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)
Khi chạy đoạn code trên, bạn sẽ nhận được kết quả:
[9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
Giải thích Code:
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
: Tạo một List tên lànumbers
chứa các số nguyên không theo thứ tự.sorted_numbers_desc = sorted(numbers, reverse=True)
:- Gọi hàm
sorted()
với đối số đầu tiên là Listnumbers
cần sắp xếp. - Tham số
reverse=True
chỉ định rằng List sẽ được sắp xếp theo thứ tự giảm dần (từ lớn đến bé). - Kết quả của
sorted()
(một List mới đã được sắp xếp) được gán cho biếnsorted_numbers_desc
.
- Gọi hàm
print(sorted_numbers_desc)
: In Listsorted_numbers_desc
ra màn hình.
Sắp xếp list trong Python với hàm Callback
Trong Python, callback function là một hàm được truyền vào như một đối số cho một hàm khác, và hàm callback này sẽ được gọi (thực thi) bên trong hàm đó.
Chúng ta có thể sắp xếp các phần tử trong List với một hàm callback bằng cách sử dụng hàm sorted()
hoặc phương thức sort()
của List trong Python. Cả hai hàm và phương thức này đều cho phép chỉ định một tiêu chí sắp xếp tùy chỉnh thông qua tham số key
. Tham số key
này nhận vào một hàm callback. Hàm callback này sẽ định nghĩa cách các phần tử được so sánh và sắp xếp.
Ví dụ 1: Sử dụng str.lower() làm tham số key
Phương thức str.lower()
trong Python được sử dụng để chuyển tất cả các ký tự trong một chuỗi thành chữ thường. Nó trả về một chuỗi mới với tất cả các ký tự chữ cái được chuyển thành chữ thường trong khi giữ nguyên các ký tự không phải chữ cái.
Trong ví dụ này, chúng ta truyền phương thức str.lower()
làm đối số cho tham số key
bên trong phương thức sort()
:
danh_sach = ['Vật Lý', 'sinh học', 'Cơ Sinh Học', 'tâm lý học']
print("List trước khi sắp xếp", danh_sach)
danh_sach.sort(key=str.lower)
print("List sau khi sắp xếp : ", danh_sach)
Kết quả đầu ra sẽ là:
List trước khi sắp xếp [‘Vật Lý’, ‘sinh học’, ‘Cơ Sinh Học’, ‘tâm lý học’]
List sau khi sắp xếp : [‘sinh học’, ‘Cơ Sinh Học’, ‘Vật Lý’, ‘tâm lý học’]
Giải thích:
danh_sach = ['Vật Lý', 'sinh học', 'Cơ Sinh Học', 'tâm lý học']
: Khởi tạo mộtList
có têndanh_sach
chứa các chuỗi.print("List trước khi sắp xếp", danh_sach)
: In raList
ban đầu.danh_sach.sort(key=str.lower)
: Đây là điểm mấu chốt.danh_sach.sort()
: Gọi phương thứcsort()
củaList
danh_sach
để sắp xếp các phần tử ngay trongList
đó (sắp xếp tại chỗ – in-place).key=str.lower
: Truyềnstr.lower
vào tham sốkey
. Điều này có nghĩa là trước khi so sánh hai phần tử trongList
, Python sẽ tạm thời chuyển đổi cả hai phần tử đó thành chữ thường bằngstr.lower()
. Nhờ đó, việc sắp xếp sẽ không phân biệt chữ hoa chữ thường.print("List sau khi sắp xếp : ", danh_sach)
: InList
sau khi đã sắp xếp.
Lưu ý: Nếu không có key=str.lowe
r, Python sẽ sắp xếp theo thứ tự bảng chữ cái, và chữ hoa sẽ được ưu tiên trước chữ thường (theo bảng mã ASCII/Unicode). Nhưng khi sử dụng str.lower
làm hàm key, Python sẽ coi các phần tử như thể chúng đều là chữ thường trong quá trình so sánh, dẫn đến kết quả sắp xếp không phân biệt hoa thường.
Ví dụ 2: Sử dụng hàm tự định nghĩa làm tham số key
Chúng ta cũng có thể sử dụng một hàm do người dùng tự định nghĩa (user-defined function) làm tham số key trong phương thức sort()
.
Trong ví dụ này, hàm so_du()
sử dụng toán tử %
để trả về số dư của phép chia, và dựa trên số dư này, việc sắp xếp sẽ được thực hiện:
def so_du(x):
return x % 10
danh_sach = [17, 23, 46, 51, 90]
print("List trước khi sắp xếp", danh_sach)
danh_sach.sort(key=so_du)
print("List sau khi sắp xếp : ", danh_sach)
Kết quả sẽ là:
List trước khi sắp xếp [17, 23, 46, 51, 90]
List sau khi sắp xếp: [90, 51, 23, 46, 17]
Giải thích:
def so_du(x):
: Định nghĩa một hàm tên làso_du
nhận vào một tham sốx
.return x % 10
: Bên trong hàmso_du
, dòng này trả về phần dư của phép chiax
cho 10. Đây chính là “chìa khóa” để sắp xếp.danh_sach = [17, 23, 46, 51, 90]
: Khởi tạo một Listdanh_sach
.print("List trước khi sắp xếp", danh_sach)
: In List ban đầu.danh_sach.sort(key=so_du)
: Sắp xếp Listdanh_sach
.key=so_du
: Điểm quan trọng là ở đây,so_du
được truyền làm tham sốkey
. Điều này có nghĩa trước khi so sánh hai số trongdanh_sach
, Python sẽ gọi hàmso_du
trên mỗi số đó, lấy kết quả trả về củaso_du
(tức là số dư khi chia cho 10) để so sánh, không phải so sánh trực tiếp các số đó.print("List sau khi sắp xếp : ", danh_sach)
In ra List sau khi đã được sắp xếp.
Lời kết
Chúng ta vừa cùng nhau tìm hiểu chi tiết về các phương pháp sắp xếp list trong Python, từ phương thức sort(), sorted() cho đến việc sử dụng hàm callback linh hoạt. Hy vọng rằng những kiến thức này sẽ hữu ích cho bạn trong quá trình lập trình. Việc nắm vững cách sắp xếp list sẽ giúp bạn xử lý dữ liệu một cách hiệu quả và tối ưu hơn.
Mọi người cũng đọc