Trong bài viết này, bạn sẽ học cách sử dụng Python sort()
phương pháp liệt kê.
Bạn cũng sẽ học một cách khác để thực hiện sắp xếp trong Python bằng cách sử dụng sorted()
chức năng để bạn có thể thấy nó khác với sort()
.
Cuối cùng, bạn sẽ biết những điều cơ bản về sắp xếp danh sách trong Python và biết cách tùy chỉnh việc sắp xếp để phù hợp với nhu cầu của bạn.
Đây là những gì chúng tôi sẽ đề cập:
- Cú pháp của
sort
phương pháp - Sắp xếp các mục danh sách theo thứ tự tăng dần
- Sắp xếp các mục danh sách theo thứ tự giảm dần
- Sắp xếp các mục danh sách bằng cách sử dụng
key
tranh luận - Sự khác biệt giữa
sort()
vàsorted()
- Khi nào nên sử dụng
sort()
vàsorted()
- Khi nào nên sử dụng
Các sort()
Phương pháp – Tổng quan về cú pháp
Các sort()
là một trong những cách bạn có thể sắp xếp danh sách trong Python.
Khi đang sử dụng sort()
bạn sắp xếp một danh sách tại chỗ. Điều này có nghĩa là danh sách ban đầu được sửa đổi trực tiếp. Cụ thể, thứ tự ban đầu của các phần tử bị thay đổi.
Cú pháp chung cho sort()
phương pháp trông như thế này:
list_name.sort(reverse=..., key=... )
Hãy chia nhỏ nó ra:
list_name
là tên của danh sách bạn đang làm việc.sort()
là một trong các phương thức danh sách của Python để sắp xếp và thay đổi danh sách. Nó sắp xếp các phần tử danh sách theo một trong hai tăng dần hoặc giảm dần trật tự.sort()
chấp nhận hai không bắt buộc thông số.reverse
là tham số tùy chọn đầu tiên. Nó chỉ định xem danh sách sẽ được sắp xếp theo thứ tự tăng dần hay giảm dần. Nó nhận một giá trị Boolean, nghĩa là giá trị đó là Đúng hoặc Sai. Giá trị mặc định là Sai, nghĩa là danh sách được sắp xếp theo thứ tự tăng dần. Đặt nó thành True sắp xếp ngược danh sách, theo thứ tự giảm dần.key
là tham số tùy chọn thứ hai. Nó nhận một hàm hoặc phương thức được sử dụng để chỉ định bất kỳ tiêu chí sắp xếp chi tiết nào mà bạn có thể có.
Các sort()
phương thức trả về None
, có nghĩa là không có giá trị trả về vì nó chỉ sửa đổi danh sách ban đầu. nó làm không phải trả về một danh sách mới.
Cách sắp xếp các mục trong danh sách theo thứ tự tăng dần bằng cách sử dụng sort()
Phương pháp
Như đã đề cập trước đó, theo mặc định, sort()
sắp xếp các mục danh sách theo thứ tự tăng dần.
Thứ tự tăng dần (hoặc tăng dần) có nghĩa là các mục được sắp xếp từ giá trị thấp nhất đến giá trị cao nhất.
Giá trị thấp nhất ở phía bên trái và giá trị cao nhất ở bên phải.
Cú pháp chung để làm điều này sẽ giống như sau:
list_name.sort()
Hãy xem ví dụ sau đây cho biết cách sắp xếp danh sách các số nguyên:
# a list of numbers
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]
#sort list in-place in ascending order
my_numbers.sort()
#print modified list
print(my_numbers)
#output
#[3, 7, 8, 10, 11, 22, 33, 54, 100]
Trong ví dụ trên, các số được sắp xếp từ nhỏ nhất đến lớn nhất.
Bạn cũng có thể đạt được điều tương tự khi làm việc với một danh sách các chuỗi:
# a list of strings
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]
#sort list in-place in alphabetical order
programming_languages.sort()
#print modified list
print(programming_languages)
#output
#['C++', 'Go', 'Java', 'Python', 'Rust', 'Swift']
Trong trường hợp này, mỗi chuỗi chứa trong danh sách được sắp xếp theo thứ tự bảng chữ cái.
Như bạn đã thấy trong cả hai ví dụ, danh sách ban đầu đã được thay đổi trực tiếp.
Cách sắp xếp các mục trong danh sách theo thứ tự giảm dần bằng cách sử dụng sort()
Phương pháp
Thứ tự giảm dần (hoặc giảm dần) ngược lại với thứ tự tăng dần – các phần tử được sắp xếp từ giá trị cao nhất đến giá trị thấp nhất.
Để sắp xếp các mục danh sách theo thứ tự giảm dần, bạn cần sử dụng tùy chọn reverse
tham số với sort()
phương thức và đặt giá trị của nó thành True
.
Cú pháp chung để làm điều này sẽ giống như thế này:
list_name.sort(reverse=True)
Hãy sử dụng lại ví dụ tương tự từ phần trước, nhưng lần này hãy sắp xếp các số theo thứ tự ngược lại:
# a list of numbers
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]
#sort list in-place in descending order
my_numbers.sort(reverse=True)
#print modified list
print(my_numbers)
#output
#[100, 54, 33, 22, 11, 10, 8, 7, 3]
Bây giờ tất cả các số được sắp xếp ngược lại, với giá trị lớn nhất ở phía bên trái và nhỏ nhất ở bên phải.
Bạn cũng có thể đạt được điều tương tự khi làm việc với một danh sách các chuỗi.
# a list of strings
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]
#sort list in-place in reverse alphabetical order
programming_languages.sort(reverse=True)
#print modified list
print(programming_languages)
#output
#['Swift', 'Rust', 'Python', 'Java', 'Go', 'C++']
Các mục danh sách hiện được sắp xếp theo thứ tự bảng chữ cái đảo ngược.
Cách sắp xếp các mục trong danh sách bằng cách sử dụng key
tham số với sort()
Phương pháp
Bạn có thể dùng key
tham số để thực hiện các hoạt động sắp xếp tùy chỉnh hơn.
Giá trị được gán cho key
tham số cần phải là một cái gì đó có thể gọi được.
Callable là thứ có thể được gọi, có nghĩa là nó có thể được gọi và tham chiếu.
Một số ví dụ về các đối tượng có thể gọi được là các phương thức và hàm.
Phương pháp hoặc chức năng này được gán cho key
sẽ được áp dụng cho tất cả các phần tử trong danh sách trước khi xảy ra bất kỳ sự sắp xếp nào và sẽ chỉ định logic cho tiêu chí sắp xếp.
Giả sử bạn muốn sắp xếp danh sách các chuỗi dựa trên độ dài của chúng.
Đối với điều đó, bạn chỉ định cài đặt sẵn len()
chức năng để key
tham số.
Các len()
hàm sẽ đếm độ dài của mỗi phần tử được lưu trữ trong danh sách bằng cách đếm các ký tự có trong phần tử đó.
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]
programming_languages.sort(key=len)
print(programming_languages)
#output
#['Go', 'C++', 'Java', 'Rust', 'Swift', 'Python']
Trong ví dụ trên, các chuỗi được sắp xếp theo thứ tự tăng dần mặc định, nhưng lần này việc sắp xếp xảy ra dựa trên độ dài của chúng.
Chuỗi ngắn nhất ở phía bên tay trái và chuỗi dài nhất ở bên phải.
Các key
và reverse
tham số cũng có thể được kết hợp.
Ví dụ: bạn có thể sắp xếp các mục trong danh sách dựa trên độ dài của chúng nhưng theo thứ tự giảm dần.
programming_languages = ["Python", "Swift","Java", "C++", "Go", "Rust"]
programming_languages.sort(key=len, reverse=True)
print(programming_languages)
#output
#['Python', 'Swift', 'Java', 'Rust', 'C++', 'Go']
Trong ví dụ trên, chuỗi đi từ dài nhất đến ngắn nhất.
Một điều khác cần lưu ý là bạn có thể tạo chức năng sắp xếp tùy chỉnh của riêng mình để tạo tiêu chí sắp xếp rõ ràng hơn.
Ví dụ: bạn có thể tạo một hàm cụ thể rồi sắp xếp danh sách theo giá trị trả về của hàm đó.
Giả sử bạn có một danh sách các từ điển có ngôn ngữ lập trình và năm tạo ra từng ngôn ngữ lập trình.
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]
Bạn có thể xác định hàm tùy chỉnh nhận giá trị của một khóa cụ thể từ từ điển.
💡 Hãy nhớ rằng một khóa từ điển và key
thông số đó sort()
chấp nhận là hai điều khác nhau!
Cụ thể, hàm sẽ lấy và trả về giá trị của year
trong danh sách từ điển, chỉ định năm khi mọi ngôn ngữ trong từ điển được tạo.
Sau đó, giá trị trả về sẽ được áp dụng làm tiêu chí sắp xếp cho danh sách.
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]
def get_year(element):
return element['year']
Sau đó, bạn có thể sắp xếp theo giá trị trả về của hàm bạn đã tạo trước đó bằng cách gán nó cho key
tham số và sắp xếp theo thứ tự thời gian tăng dần mặc định:
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]
def get_year(element):
return element['year']
programming_languages.sort(key=get_year)
print(programming_languages)
Đầu ra:
[{'language': 'C++', 'year': 1985}, {'language': 'Python', 'year': 1991}, {'language': 'Java', 'year': 1995}, {'language': 'Go', 'year': 2007}, {'language': 'Rust', 'year': 2010}, {'language': 'Swift', 'year': 2014}]
Nếu bạn muốn sắp xếp từ ngôn ngữ được tạo gần đây nhất đến ngôn ngữ cũ nhất hoặc theo thứ tự giảm dần, thì bạn sử dụng reverse=True
tham số:
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]
def get_year(element):
return element['year']
programming_languages.sort(key=get_year, reverse=True)
print(programming_languages)
Đầu ra:
[{'language': 'Swift', 'year': 2014}, {'language': 'Rust', 'year': 2010}, {'language': 'Go', 'year': 2007}, {'language': 'Java', 'year': 1995}, {'language': 'Python', 'year': 1991}, {'language': 'C++', 'year': 1985}]
Để đạt được kết quả chính xác như vậy, bạn có thể tạo một hàm lambda.
Thay vì sử dụng chức năng tùy chỉnh thông thường mà bạn đã xác định bằng cách sử dụng def
từ khóa, bạn có thể:
- tạo một biểu thức một dòng ngắn gọn,
- và không xác định tên hàm như bạn đã làm với
def
chức năng. Các hàm lambda còn được gọi là vô danh chức năng.
programming_languages = [{'language':'Python','year':1991},
{'language':'Swift','year':2014},
{'language':'Java', 'year':1995},
{'language':'C++','year':1985},
{'language':'Go','year':2007},
{'language':'Rust','year':2010},
]
programming_languages.sort(key=lambda element: element['year'])
print(programming_languages)
Hàm lambda được chỉ định với dòng key=lambda element: element['year']
sắp xếp các ngôn ngữ lập trình này từ cũ nhất đến mới nhất.
Sự khác biệt giữa sort()
và sorted()
Các sort()
phương pháp hoạt động theo cách tương tự như sorted()
chức năng.
Cú pháp chung của sorted()
chức năng trông như thế này:
sorted(list_name,reverse=...,key=...)
Hãy chia nhỏ nó ra:
sorted()
là một chức năng tích hợp chấp nhận một lần lặp. Sau đó, nó sắp xếp nó theo thứ tự tăng dần hoặc giảm dần.sorted()
chấp nhận ba tham số. Một tham số là bắt buộc và hai tham số còn lại là tùy chọn.list_name
là cần thiết tham số. Trong trường hợp này, tham số là danh sách, nhưngsorted()
chấp nhận bất kỳ đối tượng lặp nào khác.sorted()
cũng chấp nhận các tham số tùy chọnreverse
vàkey
là các tham số tùy chọn giống nhưsort()
phương pháp chấp nhận.
Sự khác biệt chính giữa sort()
và sorted()
nó có phải là sorted()
hàm lấy một danh sách và trả về một bản sao được sắp xếp mới của nó.
Bản sao mới chứa các thành phần của danh sách ban đầu theo thứ tự được sắp xếp.
Các phần tử trong danh sách ban đầu không bị ảnh hưởng và không thay đổi.
Vì vậy, để tóm tắt sự khác biệt:
- Các
sort()
phương thức không có giá trị trả về và trực tiếp sửa đổi danh sách ban đầu, thay đổi thứ tự của các phần tử chứa trong đó. - Mặt khác, các
sorted()
hàm có giá trị trả về, là bản sao được sắp xếp của danh sách gốc. Bản sao đó chứa các mục danh sách của danh sách gốc theo thứ tự được sắp xếp. Cuối cùng, danh sách ban đầu vẫn còn nguyên vẹn.
Hãy xem ví dụ sau để xem nó hoạt động như thế nào:
#original list of numbers
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]
#sort original list in default ascending order
my_numbers_sorted = sorted(my_numbers)
#print original list
print(my_numbers)
#print the copy of the original list that was created
print(my_numbers_sorted)
#output
#[10, 8, 3, 22, 33, 7, 11, 100, 54]
#[3, 7, 8, 10, 11, 22, 33, 54, 100]
Vì không có đối số bổ sung nào được cung cấp cho sorted()
nó đã sắp xếp bản sao của danh sách gốc theo thứ tự tăng dần mặc định, từ giá trị nhỏ nhất đến giá trị lớn nhất.
Và khi in danh sách ban đầu, bạn thấy rằng nó vẫn giữ nguyên và các mặt hàng có thứ tự ban đầu.
Như bạn đã thấy trong ví dụ trên, bản sao của danh sách được gán cho một biến mới, my_numbers_sorted
.
Một cái gì đó như thế không thể được thực hiện với sort()
.
Kiểm tra ví dụ sau để xem điều gì sẽ xảy ra nếu điều đó được thử với sort()
phương pháp.
my_numbers = [10, 8, 3, 22, 33, 7, 11, 100, 54]
my_numbers_sorted = my_numbers.sort()
print(my_numbers)
print(my_numbers_sorted)
#output
#[3, 7, 8, 10, 11, 22, 33, 54, 100]
#None
Bạn thấy rằng giá trị trả về của sort()
Là None
.
Cuối cùng, một điều khác cần lưu ý là reverse
và key
thông số mà sorted()
chức năng chấp nhận hoạt động chính xác giống như cách họ làm với sort()
phương pháp bạn đã thấy trong các phần trước.
Khi nào nên sử dụng sort()
và sorted()
Dưới đây là một vài điều bạn có thể muốn xem xét khi quyết định xem bạn có nên sử dụng sort()
so với sorted()
.
Trước tiên, hãy xem xét loại dữ liệu bạn đang làm việc:
- Nếu bạn đang làm việc nghiêm ngặt với một danh sách ngay từ đầu, thì bạn sẽ cần sử dụng
sort()
phương pháp kể từsort()
chỉ được gọi trên danh sách. - Mặt khác, nếu bạn muốn linh hoạt hơn và chưa làm việc với danh sách, thì bạn có thể sử dụng
sorted()
. Cácsorted()
chức năng chấp nhận và sắp xếp bất kỳ lần lặp nào (như từ điển, bộ dữ liệu và bộ) chứ không chỉ danh sách.
Tiếp theo, một điều khác cần xem xét là liệu bạn có giữ nguyên thứ tự ban đầu của danh sách mà bạn đang làm việc hay không:
- Khi gọi
sort()
, danh sách ban đầu sẽ bị thay đổi và thứ tự ban đầu sẽ bị mất. Bạn sẽ không thể lấy lại vị trí ban đầu của các thành phần danh sách. Sử dụngsort()
khi bạn chắc chắn muốn thay đổi danh sách mà bạn đang làm việc và chắc chắn rằng bạn không muốn giữ nguyên thứ tự của nó. - Mặt khác,
sorted()
hữu ích khi bạn muốn tạo một danh sách mới nhưng bạn vẫn muốn giữ lại danh sách bạn đang làm việc. Cácsorted()
sẽ tạo một danh sách được sắp xếp mới với các phần tử danh sách được sắp xếp theo thứ tự mong muốn.
Cuối cùng, một điều khác mà bạn có thể muốn xem xét khi làm việc với các tập dữ liệu lớn hơn, đó là hiệu quả về thời gian và bộ nhớ:
- Các
sort()
chiếm và tiêu tốn ít bộ nhớ hơn vì nó chỉ sắp xếp danh sách tại chỗ và không tạo danh sách mới không cần thiết mà bạn không cần. Vì lý do tương tự, nó cũng nhanh hơn một chút vì nó không tạo bản sao. Điều này có thể hữu ích khi bạn đang làm việc với các danh sách lớn hơn chứa nhiều phần tử hơn.
Phần kết luận
Và bạn có nó rồi đấy! Bây giờ bạn đã biết cách sắp xếp một danh sách trong Python bằng cách sử dụng sort()
phương pháp.
Bạn cũng đã xem qua sự khác biệt chính giữa việc sắp xếp danh sách bằng cách sử dụng sort()
và sorted()
.
Tôi hy vọng bạn tìm thấy bài viết này hữu ích.
Để tìm hiểu thêm về ngôn ngữ lập trình Python, hãy xem Chứng chỉ Máy tính Khoa học với Python của freeCodeCamp.
Bạn sẽ bắt đầu từ những điều cơ bản và học theo cách tương tác và thân thiện với người mới bắt đầu. Cuối cùng, bạn cũng sẽ xây dựng năm dự án để đưa vào thực tế và giúp củng cố những gì bạn đã học được.
Cảm ơn đã đọc và mã hóa hạnh phúc!