Kết nối

[Python] Phần 10: Kiểu dữ liệu tập hợp (Set)

500 lượt xem 
 
Thể loại: Python 

Tập hợp (tiếng Anh gọi là set) là một kiểu dữ liệu tương tự như danh sách (list) hay bộ (tuple). Tuy nhiên, điểm khác biệt là trong tập hợp thì không thể có 2 phần tử trùng nhau.

Ví dụ:

set1 = {1, "dammio", 4.75, "python"} # tập hợp có ngoặc nhọn đóng/mở
print(set1) # Kết quả: (1, 'dammio', 4.75, 'python')

set2 = {1, "dammio", "dammio", 4.75, "python"} # tập hợp có ngoặc nhọn đóng/mở
print(set2) # Kết quả: {1, 'dammio', 4.75, 'python'}, phần tử trùng nhau sẽ không tính

Tập hợp

Tập hợp là nơi lưu trữ nhiều phần tử trong một biến đơn, và là một trong 4 kiểu dữ liệu có sẵn ở Python để lưu trữ danh sách dữ liệu. Ba kiểu dữ liệu khác là danh sách (list), bộ (tuple), từ điển (dictionary). Cả 4 kiểu dữ liệu này đều có cách sử dụng khác nhau, tùy vào trường hợp cụ thể mà bạn có thể cân nhắc sử dụng cho phù hợp.

Các đặc điểm của một tập hợp:

  • Không có thứ tự: Trong tập hợp các phần tử không có thứ tự, thông thường sẽ là thứ tự ngẫu nhiên.
  • Không thể thay đổi: Các phần tử không thể thay đổi, trừ khi bạn phải xóa phần tử nào đó và thêm vào một phần tử mới.
  • Không được lập chỉ mục: Khác với danh sách, tập hợp không có chỉ mục, tức từng phần tử không có vị trí chỉ mục (index).
  • Biểu diễn các phần tử tập hợp nằm trong cặp ngoặc nhọn. Ví dụ tập hợp có 4 phần tử từ 1 đến 4: {1, 2, 3, 4}.
  • Các phần tử không thể trùng lặp nhau: Trong tập hợp mỗi phần tử chỉ là duy nhất, nếu bạn khai báo một tập hợp chứa 2 phần tử có giá trị giống nhau, khi hiển thị, tập hợp sẽ tự động loại bỏ một phần từ.

Tập hợp nên được dùng trong tình huống nào?

Khi lập trình Python, kiểu dữ liệu tập hợp thường được sử dụng trong các tình huống sau:

  • Loại bỏ các phần tử trùng lặp: Khi bạn có một danh sách hoặc chuỗi dữ liệu và muốn loại bỏ các phần tử trùng lặp để chỉ giữ lại các giá trị duy nhất, tập hợp là một lựa chọn tốt.
  • Kiểm tra sự tồn tại của một phần tử: Bạn có thể sử dụng in để kiểm tra xem một phần tử cụ thể có tồn tại trong một set hay không. Điều này làm cho việc kiểm tra sự tồn tại của các phần tử nhanh chóng hơn so với danh sách hoặc chuỗi.
  • Phép toán tập hợp: Tập hợp hỗ trợ các phép toán tập hợp như hợp, giao, hiệu, và các phép toán khác. Điều này rất hữu ích khi bạn muốn thực hiện các phép toán tập hợp trên tập hợp dữ liệu.
  • Xử lý dữ liệu không có thứ tự: Tập hợp không bảo đảm thứ tự của các phần tử, do đó thích hợp khi bạn chỉ cần lưu trữ các giá trị mà thứ tự không quan trọng.
  • Đảm bảo tính duy nhất: Tập hợp tự động đảm bảo rằng không có phần tử trùng lặp, do đó bạn không cần phải lo lắng về việc duyệt qua dữ liệu và kiểm tra tính duy nhất của mỗi phần tử.

Tạo tập hợp

Sử dụng cặp dấu ngoặc nhọn đóng/mở để tạo một số tập hợp như sau:

set1 = {} # tập hợp rỗng
print(set1) # Kết quả: rỗng

set2 = {1} # tập hợp có 1 phần tử
print(set2) # Kết quả: {1}

set3 = {1, 1} # tập hợp có 2 phần tử bằng nhau, khi hiển thị tập hợp sẽ loại bỏ phần tử trùng
print(set3) # Kết quả: {1} 

Số phần tử của tập hợp

Tương tự như danh sách và bộ, để tính số phần tử của tập hợp, chúng ta dùng hàm len().

set1 = {1, "dammio", 5.6} # tập hợp chứa 3 phần tử
print(len(set1)) # Kết quả: 3

Kiểu dữ liệu mỗi phần tử trong tập hợp

Mỗi phần tử trong tập hợp có bất kỳ kiểu dữ liệu nào, bao gồm int, string, Boolean,…

set1 = {2, "dammio", 5.6, True} # tập hợp chứa các phần tử, mỗi phần tử có thể có bất kỳ kiểu dữ liệu nào
print(set1) # Kết quả: {2, "dammio", 5.6, True}

Trong trường hợp kiểu dữ liệu Boolean (True/False) và kiểu số (0/1) đi chung với nhau thì True được tính là 1 và False được tính là 0. Do đó, kết quả chỉ hiển thị 0 hoặc 1 chứ không hiển thị True và False.

set1 = {1, "dammio", 5.6, True}
print(set1) # Kết quả: {2, "dammio", 5.6}, do True tương ứng với 1

set2 = {0, "dammio", 5.6, False}
print(set2) # Kết quả: {0, "dammio", 5.6}, do False tương ứng với 0

Bạn có thể kiểm tra kiểu dữ liệu của tập hợp bằng cách dùng hàm type() như sau:

set1 = {1, "dammio", 5.6, True}
print(type(set1)) # Kết quả: <class 'set'> cho biết biến set1 có kiểu dữ liệu tập hợp

Hàm khởi tạo set()

Để tạo một danh sách mới, bạn có thể dùng hàm set() như sau:

set1 = set((1, "dammio", 5.6))
print(set1) # Kết quả: {1, "dammio", 5.6}

Trong ví dụ trên (1, “dammio”, 5.6) có kiểu dữ liệu bộ, sau đó dùng hàm set() để tạo hợp tập hợp mới từ một tập dữ liệu bộ. Theo cách này, bạn cũng có thể tạo tập hợp mới từ một danh sách [1, “dammio”, 5.6] như sau:

set1 = set([1, "dammio", 5.6])
print(set1) # Kết quả: {1, "dammio", 5.6}

Thêm/xóa một phần tử trong tập hợp

Để thêm/xóa một phần tử trong tập hợp, bạn có thể dùng hàm add(), remove(), và discard(). Lưu ý hàm remove() sẽ trả về lỗi nếu không tìm thấy phần tử cần xóa trong danh sách. Còn hàm discard() tương tự như remove() nhưng không xuất hiện lỗi.

set1 = {1, "dammio", 5.6}
print('Tập hợp chưa thao tác: ', set1) # Kết quả: {1, "dammio", 5.6}

set1.add(2)
print('Tập hợp đã thêm 1 phần tử: ', set1) # Kết quả: {1, "dammio", 5.6, 2}

set1.remove(1)
print('Tập hợp đã xóa 1 phần tử: ', set1) # Kết quả: {"dammio", 5.6, 2}

set1.discard(10)
print('Tập hợp đã xóa 1 phần tử không xuất hiện: ', set1) # Kết quả: {"dammio", 5.6, 2}

set1.remove(10)
print('Tập hợp đã xóa 1 phần tử không xuất hiện: ', set1) # Kết quả: Lỗi

Xóa và trả về giá trị 1 phần tử đã xóa

Bạn có thể dùng hàm pop() để xóa và trả về giá trị của 1 phần tử bất kỳ trong tập hợp. Lưu ý nếu danh sách rỗng thì hàm sẽ trả về lỗi.

set1 = {2, 1, "dammio", 5.6}
print('Tập hợp chưa thao tác: ', set1) # Kết quả: {1, "dammio", 5.6}

x = set1.pop()
print('Giá trị x: ', x) # Kết quả: 1
print('Tập hợp set1: ', set1) # Kết quả: {2, "dammio", 5.6}

Xóa toàn bộ tập hợp

Để xóa toàn bộ phần tử trong tập hợp, bạn có thể dùng hàm clear().

set1 = {1, "dammio", 5.6}
set1.clear()
print(set1) # Kết quả: set(), tập rỗng

Kiểm tra phần tử có trong tập hợp hay không?

Để thực hiện việc, đơn giản bạn chỉ cần dùng từ khóa in hoặc not in như sau:

set1 = {1, "dammio", 5.6}
if (1 in set1): print('1 có trong set1')
else: print('1 không có trong set1')

if (2 not in set1): print('2 không có trong set1')
else: print('2 có trong set1')

Kiểm tra có phải tập con/tập cha hay không?

Để kiểm tra một tập có phải là tập con/tập cha của một tập khác hay không, bạn có thể dùng hàm issubset()issuperset():

set1 = {1, "dammio", 5.6}
set2 = {5.6}
if (set2.issubset(set1)): print('set2 là tập con của set1')
else: print('set2 không là tập con của set1')
# Kết quả: set2 là tập con của set1

if (set1.issuperset(set2)): print('set1 là tập cha của set2')
else: print('set2 không là tập cha của set1')
# Kết quả: set1 là tập cha của set2

Phép hợp (hợp nhất) hai tập hợp

Tương tự như phép hợp giữa hai tập hợp trong toán học, tập mới sẽ chứa tất cả phần tử của hai tập vừa hợp. Trong Python, bạn có thể dùng hàm union():

set1 = {1, "dammio", 5.6}
set2 = {5.7}
print('set2 chưa hợp với set1: ', set2) # Kết quả: {5.7}
set2 = set1.union(set2)
print('set2 đã hợp với set1: ', set2) # Kết quả: {1, 5.7, 5.6, 'dammio'}

Phép giao (Tìm phần tử chung) hai tập hợp

Tương tự như phép giao giữa hai tập hợp trong toán học, tập mới sẽ chứa các phần tử chung hai tập vừa hợp. Trong Python, bạn có thể dùng hàm intersection():

set1 = {1, "dammio", 5.6}
set2 = {5.7, "dammio", 8}
print('set2 chưa giao với set1: ', set2) # Kết quả: {8, 'dammio', 5.7}
set2 = set1.intersection(set2)
print('set2 đã giao với set1 (phần tử chung): ', set2) # Kết quả: {'dammio'}

Phép trừ hai tập hợp

Tương tự như phép trừ giữa hai tập hợp A & B trong toán học, tập mới sẽ chứa các phần tử thuộc tập A nhưng không thuộc B. Trong Python, bạn có thể dùng hàm difference():

set1 = {1, "dammio", 5.6}
set2 = {5.7, "dammio", 8}
print('set2 chưa trừ set1: ', set2) # Kết quả: {8, 'dammio', 5.7}
set2 = set2.difference(set1)
print('set2 đã trừ set1: ', set2) # Kết quả: {5.7, 8}

Phép XOR hai tập hợp

Tương tự như phép XOR giữa hai tập hợp A & B trong toán học, tập mới sẽ chứa các phần tử thuộc tập A hoặc thuộc B, nhưng không thuộc cả hai. Trong Python, bạn có thể dùng hàm symmetric_difference():

set1 = {1, "dammio", 5.6}
set2 = {5.7, "dammio", 8}
print('set2 chưa XOR với set1: ', set2) # Kết quả: {8, 'dammio', 5.7}
set2 = set2.symmetric_difference(set1)
print('set2 đã XOR với set1: ', set2) # Kết quả: {1, 5.6, 5.7, 8}

Copy tập mới

Bạn có thể dùng hàm copy() để tạo 1 tập hợp mới hoàn toàn mà thao tác trên tập này không ảnh hưởng tới tập cũ.

set1 = {1, "dammio", 5.6}
set2 = set1.copy()
print('set1: ', set2) # Kết quả: {1, "dammio", 5.6}

set2 = set2 - {1}
print('set2: ', set2) # Kết quả: {"dammio", 5.6}, do đã bỏ phần tử có giá trị là 1 khỏi tập hợp

Bài viết đã trình bày cho bạn về tập hợp trong Python, các hàm xử lý với tập hợp kèm theo các ví dụ. Chúc các bạn học tốt!

Liên quan:  Những điều thú vị và lạ lùng về ngôn ngữ lập trình Python
Trích dẫn bài viết
  • APA:
    Dammio. (2023). [Python] Phần 10: Kiểu dữ liệu tập hợp (Set). https://www.dammio.com/2023/09/11/python-phan-10-kieu-du-lieu-tap-hop-set.
  • BibTeX:
    @misc{dammio,
    author = {Dammio},
    title = {[Python] Phần 10: Kiểu dữ liệu tập hợp (Set)},
    year = {2023},
    url = {https://www.dammio.com/2023/09/11/python-phan-10-kieu-du-lieu-tap-hop-set},
    urldate = {2024-07-23}
    }
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
0
Rất thích suy nghĩ của bạn, hãy bình luận.x