Python - Tập hợp (Sets)

Chào, các bạn nhà lập trình Python đam mê! Hôm nay, chúng ta sẽ đến được với thế giới kỳ diệu của Tập hợp (Sets) trong Python. Là một giáo viên khoa học máy tính thân thiện, tôi rất vui mừng hướng dẫn các bạn trong chuyến hành trình này. Vậy, hãy lấy ly đồ uống yêu thích của bạn, thoải mái ngồi xuống và cùng khám phá tập hợp nhé!

Python - Sets

Tập hợp trong Python

Tưởng tượng bạn có một túi đáu đỏ nét đầy màu sắc. Mỗi viên đáu đều là duy nhất, và bạn không quan tâm đến thứ tự chúng - bạn chỉ muốn biết màu sắc của chúng là gì. Đó chính là điều gì mà tập hợp trong Python!

Một tập hợp là một tập hợp các phần tử duy nhất không có thứ tự. Nó giống như một tập hợp toán học: không cho phép trùng lặp và thứ tự không quan trọng. Tập hợp rất hữu ích khi bạn cần lưu trữ các phần tử duy nhất hoặc thực hiện các phép toán tập hợp như hợp, giao và hiệu.

Tạo một Tập hợp trong Python

Bắt đầu bằng cách tạo tập hợp đầu tiên của chúng ta. Có hai cách chính để tạo một tập hợp trong Python:

  1. Sử dụng dấu ngoặc móc {}
  2. Sử dụng hàm constructor set()

Dưới đây là một ví dụ về cả hai phương pháp:

# Phương pháp 1: Sử dụng dấu ngoặc móc
fruits = {'apple', 'banana', 'cherry'}

# Phương pháp 2: Sử dụng hàm constructor set()
colors = set(['red', 'green', 'blue'])

print(fruits)
print(colors)

Output:

{'cherry', 'apple', 'banana'}
{'blue', 'red', 'green'}

Lưu ý rằng thứ tự của các phần tử trong kết quả có thể khác với cách chúng ta đã định nghĩa. Đó là vì tập hợp không có thứ tự!

Các phần tử trùng lặp trong Tập hợp

Nhớ khi tôi nói rằng tập hợp chỉ chứa các phần tử duy nhất? Hãy xem điều gì xảy ra khi chúng ta cố gắng thêm các phần tử trùng lặp:

numbers = {1, 2, 3, 2, 4, 3, 5}
print(numbers)

Output:

{1, 2, 3, 4, 5}

Như bạn thấy, Python tự động loại bỏ các phần tử trùng lặp cho chúng ta. Điều này có khá tuyệt vời phải không?

Thêm Phần tử vào Tập hợp

Để thêm một phần tử duy nhất vào tập hợp, chúng ta sử dụng phương thức add(). Nếu chúng ta muốn thêm nhiều phần tử cùng lúc, chúng ta sử dụng phương thức update().

# Thêm một phần tử duy nhất
fruits.add('orange')
print(fruits)

# Thêm nhiều phần tử
fruits.update(['grape', 'mango'])
print(fruits)

Output:

{'cherry', 'apple', 'banana', 'orange'}
{'cherry', 'mango', 'apple', 'banana', 'orange', 'grape'}

Loại bỏ Phần tử khỏi Tập hợp

Có nhiều cách để loại bỏ các phần tử khỏi tập hợp. Hãy khám phá chúng:

# Sử dụng remove() - ném ra lỗi nếu phần tử không tồn tại
fruits.remove('banana')

# Sử dụng discard() - không ném ra lỗi nếu phần tử không tồn tại
fruits.discard('kiwi')

# Sử dụng pop() - loại bỏ và trả về một phần tử ngẫu nhiên
popped = fruits.pop()
print(f"Phần tử bị loại bỏ: {popped}")

# Sử dụng clear() - loại bỏ tất cả các phần tử
fruits.clear()

print(fruits)

Output:

Phần tử bị loại bỏ: cherry
set()

Kiểm tra Tính thuộc của Phần tử trong Tập hợp

Một trong những điều tuyệt vời về tập hợp là chúng cho phép kiểm tra tính thuộc rất nhanh. Chúng ta có thể sử dụng từ khóa in để kiểm tra xem một phần tử có tồn tại trong tập hợp hay không:

numbers = {1, 2, 3, 4, 5}
print(3 in numbers)  # True
print(6 in numbers)  # False

Hoạt động này nhanh hơn nhiều so với danh sách, đặc biệt là đối với các tập hợp lớn!

Các Phép toán Tập hợp

Tập hợp trong Python hỗ trợ nhiều phép toán tập hợp toán học. Hãy xem một số của chúng:

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# Hợp
print(set1 | set2)  # hoặc set1.union(set2)

# Giao
print(set1 & set2)  # hoặc set1.intersection(set2)

# Hiệu
print(set1 - set2)  # hoặc set1.difference(set2)

# Hiệu đối
print(set1 ^ set2)  # hoặc set1.symmetric_difference(set2)

Output:

{1, 2, 3, 4, 5, 6, 7, 8}
{4, 5}
{1, 2, 3}
{1, 2, 3, 6, 7, 8}

Tập hợp Định luật trong Python

Giống như danh sách định luật, Python cũng hỗ trợ tập hợp định luật. Chúng cung cấp cách viết ngắn gọn để tạo tập hợp dựa trên các đối tượng lặp lại hiện có.

# Tạo một tập hợp chứa bình phương của các số từ 0 đến 9
squares = {x**2 for x in range(10)}
print(squares)

Output:

{0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

Lọc Phần tử bằng Tập hợp Định luật

Chúng ta cũng có thể sử dụng tập hợp định luật để lọc các phần tử:

# Tạo một tập hợp chứa các bình phương chẵn từ 0 đến 9
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares)

Output:

{0, 4, 16, 36, 64}

Tập hợp Định luật Lồng nhau

Mặc dù ít phổ biến hơn, tập hợp định luật lồng nhau cũng có thể xảy ra:

# Tạo một tập hợp các cặp (x, y) nơi x và y là các chữ số
digit_pairs = {(x, y) for x in range(3) for y in range(3)}
print(digit_pairs)

Output:

{(0, 1), (1, 2), (0, 0), (2, 0), (1, 1), (2, 2), (0, 2), (2, 1), (1, 0)}

Tập hợp Đóng băng

Cuối cùng nhưng không kém phần quan trọng, hãy nói về tập hợp đóng băng. Một tập hợp đóng băng là phiên bản không thay đổi của một đối tượng tập hợp Python. Trong khi các phần tử của một tập hợp có thể được sửa đổi bất cứ lúc nào, các phần tử của tập hợp đóng băng giữ nguyên không thay đổi sau khi tạo.

normal_set = {1, 2, 3}
frozen_set = frozenset([1, 2, 3])

normal_set.add(4)  # Điều này hoạt động
# frozen_set.add(4)  # Điều này sẽ ném ra lỗi AttributeError

Tập hợp đóng băng rất hữu ích khi bạn cần một tập hợp không thay đổi, như sử dụng nó như khóa của từ điển.

Và thế là đã xong, các bạn! Chúng ta đã bao phủ mọi khía cạnh của tập hợp Python. Hãy nhớ, luyện tập là chìa khóa để hoàn thành, vì vậy đừng ngần ngại thử nghiệm các khái niệm này. Chúc các bạn lập trình vui vẻ!

Dưới đây là bảng tóm tắt các phương thức chính mà chúng ta đã thảo luận:

Phương thức Mô tả
add() Thêm một phần tử vào tập hợp
update() Thêm nhiều phần tử vào tập hợp
remove() Loại bỏ một phần tử cụ thể khỏi tập hợp (ném ra lỗi nếu không tìm thấy)
discard() Loại bỏ một phần tử cụ thể khỏi tập hợp (không ném ra lỗi nếu không tìm thấy)
pop() Loại bỏ và trả về một phần tử ngẫu nhiên khỏi tập hợp
clear() Loại bỏ tất cả các phần tử khỏi tập hợp
union() Trả về một tập hợp chứa hợp của các tập hợp
intersection() Trả về một tập hợp chứa giao của các tập hợp
difference() Trả về một tập hợp chứa hiệu của các tập hợp
symmetric_difference() Trả về một tập hợp chứa các phần tử trong một trong các tập hợp nhưng không có trong cả hai

Credits: Image by storyset