Set trong Python là gì

Trong toán học, là khái niệm không thể định nghĩa. Ta hiểu tập hợp như sự tụ tập các đối tượng nào đó, mà ta gọi là các phần tử. Kiểu dữ liệu tập hợp set trong Python cũng giống như vậy, là một tập các phần tử trong đó mỗi phần tử chỉ xuất hiện đúng một lần. Hiểu đơn giản như kể tên các học sinh trong một lớp, mỗi học sinh đương nhiên chỉ được kể một lần, và ta không cần theo thứ tự nào cả; lúc này, ta cần đến kiểu tập hợp.

1. Cách khai báo kiểu tập hợp set trong Python

Để tạo một tập hợp set ta có cú pháp khá giống với kiểu từ điển dictionary, với các phần tử trong cặp ngoặc nhọn cách nhau bởi dấu phẩy. Tuy nhiên, mỗi phần tử của set là một giá trị [thay cho một cặp giá trị như với dictionary], ví dụ:

>>> A = {1, 7, 2, 6, 4, 5} >>> my_set = {1.0, "Hello", [1, 2, 3]} >>> my_set {1.0, 'Hello', [1, 2, 3]}

Kiểu tập hợp set trong Python có các đặc điểm sau:

  • Các phần tử của tập hợp được đặt trong cặp ngoặc nhọn {} các phần tử phân cách bởi dấu phẩy ,.
  • Mỗi phần tử chỉ xuất hiện một lần cho dù bạn có nhập nó nhiều lần.
  • Kiểu tập hợp set cũng có các phép lấy hợp, lấy giao như trong Toán học.
  • Để tạo một tập hợp s rỗng, bạn cần dùng hàm không có thông số s = set[]. Vì sử dụng s = {} sẽ tạo một từ điển dictionary rỗng.

Tập hợp set là dữ liệu thay đổi được mutable, tuy nhiên bản thân mỗi phần tử trong set thì lại không thể thay đổi immutable được. Tức là, các phần tử của một set chỉ có thể là các kiểu dữ liệu không thay đổi được immutable như các kiểu số, kiểu chuỗi… mà không thể là kiểu danh sách, từ điển. Như ví dụ sau, chúng ta cố gắng gán một phần tử của tập my_set là một danh sách [3, 4] thì Python báo lỗi kiểu dữ liệu ngay lập tức.

>>> my_set = {1, 2, [3, 4]} Traceback [most recent call last]: File "", line 1, in TypeError: unhashable type: 'list'

Python cũng có loại tập hợp không thay đổi được immutable set gọi là frozenset.

Truy cập các phần tử của một tập hợp set trong Python

Bạn không thể truy cập các phần tử trong một tập hợp bằng cách sử dụng chỉ mục index như kiểu danh sách list, nhưng bạn có thể duyệt qua lần lượt các phần tử của nó bằng cách sử dụng vòng lặp for  cùng với toán tử in để kiểm tra một đối tượng nào đó có thuộc về tập hợp đã cho không.

>>> thisset = {"apple", "banana", "cherry"} >>> for x in thisset: ... print[x] ... cherry banana apple

2. Các toán tử và phương thức trên kiểu tập hợp set

Giả sử S, S1 và S2 là các tập hợp, x là một phần tử:

2.1. Toán tử in

Sử dụng cú pháp x in S để kiểm tra phần tử x có nằm trong tập S hay không. Trả về kết quả True nếu tập S chứa phần tử x, False nếu S không chứa x.

>>> S = {1, 3, 2, 8, 10} >>> 1 in S True >>> 4 in S False

2.2. Hàm len[]

Hàm len[S]trả về số lượng phần tử của tập S, kết quả trả về là một số nguyên không âm.

>>> S = {1, 3, 2, 8, 10} >>> len[S] 5 >>> A = set[] #tập A là tập rỗng >>> len[A] 0

2.3. Các phương thức add, remove, discard, pop, clear

  • Phương thức .add[x] sẽ thêm phần tử x vào tập .
  • Phương thức .update[]sẽ thêm các phần tử của vào . Có thể thay bởi các dữ liệu kiểu liệt kê như tập hợp set, bộ tuple…
  • Phương thức .remove[x], .discard[x] sẽ xóa phần tử x khỏi tập .
  • Phương thức .pop[] trả về phần tử đứng đầu tiên trong tập đồng thởi xóa phần tử đó khỏi tập .
>>> thisset = {2, 'banana', 'cherry', 'apple', 1, 3} >>> thisset {1, 2, 3, 'banana', 'cherry', 'apple'} >>> thisset.pop[] 1 >>> thisset.pop[] 2 >>> thisset.pop[] 3 >>> thisset.pop[] 'banana'

Chú ý rằng, tập hợp không được đánh chỉ mục nên bạn sẽ không thể biết được phần tử nào đứng đầu tiên, Python có quy luật riêng để quyết định phần tử nào đứng đầu tiên. Như trong ví dụ trên, bạn nhập vào phần tử 2 đầu tiên, nhưng Python lại lưu trong bộ nhớ phần tử 1 ở vị trí đầu tiên.

  • Phương thức .clear[] xóa tất cả các phần tử của tập .
>>> S = {1, 2, 3, 4, 5, 6} >>> S.add[100] #Thêm phần tử 100 vào tập S >>> S {1, 2, 3, 4, 5, 6, 100} >>> S.remove[1] #Xóa phần tử 1 khỏi tập S >>> S {2, 3, 4, 5, 6, 100} >>> S.pop[] #Lấy ra phần tử đầu tiên của tập hợp 2 >>> S {3, 4, 5, 6, 100} >>> S.discard[6] >>> S {3, 4, 5, 100} >>> S.clear[] #Xóa hết mọi phần tử của S, lúc này S trở thành rỗng >>> S set[]

Chú ý rằng hai thủ tục remove[x] và discard[x] cùng xóa đi phần tử x, nhưng sự khác nhau ở đây là nếu tập S không tồn tại phần tử x thì phương thức:

  • remove[x] sẽ trả về kết quả None.
  • discard[x] sẽ trả về lỗi KeyError.

Hãy xem ví dụ sau để hiểu rõ hơn.

>>> S = {'a', 'b', 'c', 'd'} >>> S.discard['e'] #Không hiển thị gì, dùng print để xem kết quả >>> print[S.discard['e']] None >>> S.remove['e'] Traceback [most recent call last]: File "", line 1, in KeyError: 'e'

2.3. Các phép toán trên kiểu tập hợp set trong Python

Phép lấy hiệu hai tập hợp set trong Python

Phép lấy hiệu hai tập hợp S1 và S2, sử dụng cú pháp S1-S2 hoặc S1.difference[S2]. Kết quả trả về là một tập mới chứa các phần tử thuộc tập S1 và không thuộc tập S2. Một phép toán tương tự là S1.symmetric_difference[S2] hoặc S1^S2 có tác dụng như S2 – S1.

>>> S1 = {1, 2, 3, 4, 5, 6} >>> S2 = {0, 2, 4, 6, 8, 10} >>> S1 – S2 {1, 3, 5} #Hiệu của tập S1 và S2

Phép lấy hợp hai tập hợp set trong Python

Sử dụng cú pháp S1|S2 hoặc S1.union[S2] để lấy hợp hai tập hợp S1 và S2. Kết quả trả về một tập mới chứa tất cả các phần tử thuộc tập S1 và tất cả các phần tử thuộc tập S2. Đương nhiên, nếu phần tử nào đó thuộc cả hai tập hợp thì chỉ được kể một lần.

>>> S1 = {1, 2, 3, 4, 5, 6} >>> S2 = {0, 2, 4, 6, 8, 10} >>> S1|S2 {0, 1, 2, 3, 4, 5, 6, 8, 10} #Hợp của S1 và S2

Phép lấy giao hai tập hợp set trong Python

Sử dụng cú pháp S1 & S2 hoặc S1.intersection[S2] để lấy giao hai tập hợp S1 và S2. Kết quả trả về một tập mới chứa tất cả các phần tử thuộc đồng thời cả hai tập S1 và S2. Tức là các phần tử chung của hai tập hợp đó.

>>> S1 = {1, 2, 3, 4, 5, 6} >>> S2 = {0, 2, 4, 6, 8, 10} >>> S1&S2 {2, 4, 6} #Giao của S1 và S2 gồm ba phần tử 2, 4, 6

Toán tử kiểm tra tập con

Để kiểm tra tập S1 có là tập con của S2 hay không, ta sử dụng cú pháp S1>> S1 = {1, 2, 3, 4, 5, 6, 7} >>> S2 = {1, 2, 5} >>> S3 = {1, 2, 5, 9} >>> S4 = set[] >>> S1.issubset[S1] #Mọi tập đều là tập con của chính bản thân nó True >>> S2.issubset[S1] True >>> S3.issubset[S1] False >>> S4.issubset[S1] #Tập rỗng là tập con của mọi tập hợp True

Ngược lại của tập con, chúng ta có thể sử dụng S1 >= S2 hoặc S1.issupperset[S2] để kiểm tra S1 có là tập cha của [tức là có chứa] S2 hay không, trả về True nếu đúng và False nếu sai. Tập S1 là tập cha của S2 nếu mọi phần tử của S2 đều thuộc tập S1.

>>> S1 = {1, 2, 3, 4, 5, 6, 7} >>> S2 = {1, 2, 5} >>> S3 = {1, 2, 5, 9} >>> S4 = set[] >>> S1.issupperset[S1] #Mọi tập đều là tập cha của chính bản thân nó True >>> S1.issupperset[S2] True >>> S1.issupperset[S3] False >>> S1.issupperset[S4] True

Tập con thực sự, tập cha thực sự

Sử dụng cú phsp S1S2 để kiểm tra S1 có là tập con thực sự, tập cha thực sự của S2 hay không. Tập S1 là tập con thực sự của S2 nếu S1 là tập con của S1 nhưng S1 và S2 không bằng nhau. Tương tự đối với khái niệm tập cha thực sự.

3. Bài tập kiểu tập hợp set trong Python

Bài 1. Cô giáo Thảo thống kê chiều cao của các học sinh trong lớp 12A được kết quả như sau:

161 182 161 154 176 170 167 171 170 174 150 142 148 165 170 178 156 145 149 163 162 159 165 165 170 180 155 159 155 153 152 162 180 168 169 168 167 170
  1. Hỏi lớp có bao nhiêu học sinh?
  2. Tính chiều cao trung bình của các học sinh trong lớp.
  3. Liệt kê các chiều cao khác nhau của học sinh trong lớp. Tính giá trị trung bình của chúng.

Bài 2. Liệt kê tập hợp S gồm các kí tự của câu sau, kể cả dấu cách trắng:

Mọc giữa dòng sông xanh Một bông hoa tím biếc Ơi con chim chiền chiện Hót chi mà vang trời Từng giọt long lanh rơi Tôi đưa tay hứng về.

Tập hợp S có bao nhiêu phần tử. Thêm vào tập S các phần tử là các kí tự xuất hiện trong câu sau
tôi rất nghèo tiền bạc, chỉ giàu thời gian thôi.

Bài 3. Cho tập hợp A gồm có các phần tử sau, mỗi phần tử cách nhau bởi dấu cách trắng:

1 a 5 7 f 0 89 g i 11 88 3 p

Liệt kê các tập con có hai phần tử của tập hợp A. Có tất cả bao nhiêu tập con như vậy.

Bài 4. Một lớp có 40 học sinh trong đó có 10 bạn học tiếng Pháp, 14 bạn học tiếng Anh, 6 bạn học cả hai thứ tiếng đó. Hỏi có bao nhiêu học sinh không học tiếng Pháp mà cũng không học tiếng Anh.

Bài 5.  Trong một lớp học mỗi học sinh đều chơi thể bóng đá hoặc bóng chuyền. Có 25 học sinh chơi bóng đá, 27 học sinh chơi bóng chuyền và 18 học sinh chơi cả hai. Hỏi lớp đó có bao nhiêu học sinh?

Video liên quan

Chủ Đề