18/03/2021, 09:39

Hàm sorted() trong Python

Hàm sorted() trong Python sắp xếp các phần tử của một đối tượng theo thứ tự nhất định (tăng dần hoặc giảm dần) và trả về đối tượng dưới dạng danh sách đã sắp xếp. Cú pháp của hàm sorted() sorted(đối tượng, key=None, reverse=False) Tham số của hàm sorted() sorted() có thể có tối đa 3 thông ...

Hàm sorted() trong Python sắp xếp các phần tử của một đối tượng theo thứ tự nhất định (tăng dần hoặc giảm dần) và trả về đối tượng dưới dạng danh sách đã sắp xếp.

Cú pháp của hàm sorted()

sorted(đối tượng, key=None, reverse=False)

Tham số của hàm sorted()

sorted() có thể có tối đa 3 thông số:

  • Đối tượng: Mỗi chuỗi (string, tuple, list) hoặc một bộ sưu tập (set, dictionary, frozen set) hoặc bất kỳ đối tượng iterator  nào.
  • reverse (tùy chọn): Nếu giá trị là True, danh sách sẽ được sắp xếp theo kiểu đảo ngược (hoặc giảm dần). Nếu không được khai báo, giá trị mặc định là False.
  • key (tùy chọn): Nếu có, hàm sorted() so sánh giá trị với key sau đó sắp xếp. Giá trị mặc định là None.
Hàm sorted() trong Python được dùng để sắp xếp các phần tử trong đối tượngHàm sorted() trong Python được dùng để sắp xếp các phần tử trong đối tượng

Ví dụ 1: Sắp xếp string, lish và tuble

Mời các bạn xem đoạn code sau:

# Sắp xếp list
py_list = ['q', 'u', 'a', 'n', 't', 'r', 'i', 'm', 'a', 'n', 'g']
print(sorted(py_list))

# Sắp xếp string
py_string = 'Quantrimang'
print(sorted(py_string))

# Sắp xếp tuple
py_tuple = ('q', 'u', 'a', 'n', 't', 'r', 'i', 'm', 'a', 'n', 'g')
print(sorted(py_tuple))

Khi chạy chương trình kết quả thu được là:

['a', 'a', 'g', 'i', 'm', 'n', 'n', 'q', 'r', 't', 'u']
['Q', 'a', 'a', 'g', 'i', 'm', 'n', 'n', 'r', 't', 'u']
['a', 'a', 'g', 'i', 'm', 'n', 'n', 'q', 'r', 't', 'u']

Chú ý: Một list cũng có hàm sort() hoạt động tương tự hàm sorted(). Khác biệt duy nhất đó là hàm sort() không trả về bất kỳ giá trị nào và thay đổi danh sách ban đầu.

Ví dụ 2: Sắp xếp theo thứ tự giảm dần

Hàm sorted() có tham số đảo ngược và khi bạn đặt reverse=True, danh sách sẽ được sắp xếp theo thứ tự giảm dần.

Hãy xem xét những dòng code sau:

# Sắp xếp set
py_set = {'q', 'u', 'a', 'n', 't', 'r', 'i', 'm', 'a', 'n', 'g'}
print(sorted(py_set, reverse=True))

# Sắp xếp dictionary
py_dict = {'e': 1, 'a': 2, 'u': 3, 'o': 4, 'i': 5}
print(sorted(py_dict, reverse=True))

# Sắp xếp frozen set
frozen_set = frozenset(('q', 'u', 'a', 'n', 't', 'r', 'i', 'm', 'a', 'n', 'g'))
print(sorted(frozen_set, reverse=True))

Khi chạy chương trình, kết quả trả về là:

['u', 't', 'r', 'q', 'n', 'm', 'i', 'g', 'a']
['u', 'o', 'i', 'e', 'a']
['u', 't', 'r', 'q', 'n', 'm', 'i', 'g', 'a']

Tham số key của hàm sorted() trong Python

Nếu bạn muốn sắp xếp theo kiểu riêng của mình, hàm sorted() cũng chấp nhận việc lấy một key làm tham số tùy chọn.

Bạn có thể sắp xếp đối tượng dựa trên giá trị được trả về của key. Ví dụ:

sorted(iterable, key=len)

Ở đây, len() là một hàm tích hợp sẵn của Python với nhiệm vụ đếm chiều dài của một đối tượng.

Danh sách được sắp xếp dựa trên độ dài của phần tử, từ số thấp nhất đến cao nhất.

Ví dụ 3: Sắp xếp một list bằng hàm sorted() có chứa key

Mời các bạn xem đoạn code:

# Xắp xếp dựa trên phần tử thứ 2
def take_second(elem):
    return elem[1]


# list ngẫu nhiên
random = [(2, 2), (3, 4), (4, 1), (1, 3)]

# sắp xếp list với key
sorted_list = sorted(random, key=take_second)

# hiển thị list
print('List đã được sắp xếp:', sorted_list)

Sau khi chạy chương trình, kết quả thu được là

List đã được sắp: [(4, 1), (2, 2), (1, 3), (3, 4)]

Ví dụ 4: Sắp xếp với nhiều key

Ban đầu chúng ta có một danh sách như sau:

# List kết quả thi học kỳ của các sinh viên
# Các thành phần của list: (Tên sinh viên, Điểm số đạt được theo thang 100, Tuổi)

participant_list = [
    ('Lê An', 50, 18),
    ('Trần Bình', 75, 12),
    ('Trần Tâm', 75, 20),
    ('Thanh Lam', 90, 22),
    ('Vũ Lan', 45, 12)
]

Bây giờ chúng ta cần sắp xếp list sinh viên theo điểm số từ cao xuống thấp. Trong trường hợp này, nếu sinh viên có cùng điểm số thì sinh viên nhỏ tuổi hơn sẽ được xếp ở vị trí phía trước.

Chúng ta có thể làm được điều này với hàm sorted() nhiều key bằng cách đưa các con số về dạng tuple.

Hai tuple có thể được so sánh bằng cách so sánh các yếu tố từ đầu đến cuối. Nếu có một yếu tố bằng nhau, yếu tố thứ hai sẽ được so sánh... tiếp tục cho tới hết.

>>> (1,3) > (1, 4)
False
>>> (1, 4) < (2,2)
True
>>> (1, 4, 1) < (2, 1)
True

Dùng cách xử lý này, chúng ta có thể xây dựng đoạn code so sánh như sau:

# List kết quả thi học kỳ của các sinh viên
# Các thành phần của list: (Tên sinh viên, Điểm số đạt được theo thang 100, Tuổi)

participant_list = [
    ('Lê An', 50, 18),
    ('Trần Bình', 75, 12),
    ('Trần Tâm', 75, 20),
    ('Thanh Lam', 90, 22),
    ('Vũ Lan', 45, 12)
]


def sorter(item):
    
    error = 100 - item[1]
    age = item[2]
    return (error, age)


sorted_list = sorted(participant_list, key=sorter)
print(sorted_list)

Khi chạy chương trình, kết quả thu được là:

[('Thanh Lam', 90, 22), ('Trần Bình', 75, 12), ('Trần Tâm', 75, 20), ('Lê An', 50, 18), ('Vũ Lan', 45, 12)

Do hàm sắp xếp ngắn và chỉ cần một dòng nên hàm lambda được sử dụng bên trong key thay vì chuyển ra ngoài thành hàm riêng.

Đoạn code trên có thể viết lại bằng hàm lambda theo cách sau:

# List kết quả thi học kỳ của các sinh viên
# Các thành phần của list: (Tên sinh viên, Điểm số đạt được theo thang 100, Tuổi)

participant_list = [
    ('Lê An', 50, 18),
    ('Trần Bình', 75, 12),
    ('Trần Tâm', 75, 20),
    ('Thanh Lam', 90, 22),
    ('Vũ Lan', 45, 12)
]

sorted_list = sorted(participant_list, key=lambda item: (100-item[1], item[2]))
print(sorted_list)

Kết quả thu được vẫn là:

[('Thanh Lam', 90, 22), ('Trần Bình', 75, 12), ('Trần Tâm', 75, 20), ('Lê An', 50, 18), ('Vũ Lan', 45, 12)

Chúc các bạn sớm quen với hàm sorted() trong Python và đừng quên truy cập trang web dưới đây để học thêm các hàm Python hữu ích khác.

  • Các hàm Python tích hợp sẵn
  • Hàm setattr() trong Python
  • Hàm repr() trong Python
  • Hàm property() trong Python
  • Hàm oct() trong Python là gì?
  • Hàm memoryview() trong Python
  • Hàm hash() trong Python
0