Set trong Python

Set cũng là một container, tuy nhiên không được sử dụng nhiều bằng list hay tuple trong Python.

Các đặc điểm của set

  • Được giới hạn bởi cặp ngoặc ({}), các phần tử trong set được ngăn cách bằng dấu phẩy (,).
  • Set không có thứ tự vì vậy các phương thức indexing và slice sẽ không được hỗ trợ trong set.
  • Các phần tử của set là duy nhất, không được phép trùng lặp.
  • Set có thể sửa đổi (mutable) nhưng các phần tử trong set phải thuộc loại không thể thay đổi (immutable), vì vậy set không thể chứa 1 set khác.
>>> a = {1, 'a', (1, 2, 3)}
# set có thể chứa nhiều kiểu dữ liệu khác nhau
>>> type(a)
# <class 'set'>
>>> b = {[1, 2], [3, 4]}
# set không thể chứa list vì list và đối tượng `mutable`
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Khởi tạo set

  • Sử dụng cặp ngoặc {} và đặt giá trị bên trong 
Cú pháp:
set_x = {<value_1>, <value_2>, .., <value_n>}
  • Sử dụng set contructor 
Cú pháp:
set(iterable)
>>> a = set((1, 2, 3, 4))
# khởi tạo set từ đối tượng tuple
>>> a
{1, 2, 3}
>>> b = set('aaaaaaaa')
# khởi tạo set từ đối tượng string
>>> b
{'a'}
  • Sử dụng set comprehension
>>> a = { value for value in range(3)}
>>> a
{0, 1, 2}

Toán tử trong set

  • Toán tử in Trả về True nếu value tồn tại trong set. Ngược lại trả về False.
>>> 1 in {1, 2, 3, 4}
True
>>> 5 in {1, 2, 3, 4}
False
  • Toán tử not in Ngược với toán tử in. Trả về True nếu value không tồn tại trong set, ngược lại sẽ trả về False.
>>> 1 not in {1, 2, 3, 4}
False
>>> 5 not in {1, 2, 3, 4}
True
  • Toán tử - 
Cú pháp:
set1 - set2 - ..... - setn
Trả về một set gồm các phần tử chỉ tồn tại trong set1 mà không tồn tại trong set2...setn.
>>> set1 = {1, 2, 3, 4, 5}
>>> set2 = {1, 2, 3}
>>> set1 - set2
{4, 5}
  • Toán tử & 
Cú pháp:
set1 & set2 & ..... & setn
Trả về một set chứa các phần tử cùng tồn tại trong cả tất cả các set.
>>> set1 = {1, 2, 3, 4, 5}
>>> set2 = {1, 2, 3}
>>> set1 & set2
{1, 2, 3}
  • Toán tử | 
Cú pháp:
set1 | set2 | ... | setn
Trả về một set chứa tất cả các phần tử tồn tại trong các set và chỉ giữ lại 1 giá trị duy nhất của các phần tử trùng.
>>> set1 = {1, 2, 3, 4, 5}
>>> set2 = {1, 2, 3}
>>> set1 | set2
{1, 2, 3, 4, 5}
  • Toán tử ^ 
Cú pháp:

set1 ^ set2 ..... ^ setn
Trả về một set chứa tất cả các phần tử chỉ tồn tại ở một set mà không tồn tại trong các set khác, nghĩa là các phần tử trùng lặp sẽ bị loại bỏ.
>>> set1 = {1, 2, 3, 4, 5}
>>> set2 = {1, 2, 3}
>>> set1 ^ set_2 
{4, 5}
  • Toán tử == và != 
Cú pháp:
set1 [==, !=] set2 ...... [==, !=] setn
So sánh hai hay nhiều set với nhau. Các phép toán thực hiện từ trái qua phải.
>>> a = {1,2,3}
>>> b = set({i for i in range(1,4)})
>>> a == b
True
>>> a != b
False

Các phương thức được dựng sẵn trong set

Phương thứcMiêu tả
set.add()Thêm một phần tử vào set
set.clear()Xóa tất cả phần tử khỏi set
set.copy()Trả về một bản sao của set
set.difference()Trả về một set mới chứa các phần tử khác biệt giữa hai hay nhiều set
set.difference_update()Xóa tất cả các thành phần của set khác tồn tại trong set này
set.discard()Xóa một phần tử khỏi set nếu nó tồn tại trong set
set.intersection()Trả về một set mới chứa các phần tử giống nhau giữa 2 set
set.intersection_update()Cập nhật set với các phần tử giống nhau giữa nó và set khác
set.isdisjoint()Trả về True nếu 2 set không có phần tử giống nhau
set.issubset()Trả về True nếu set khác chứa các phần tử của set này
set.issuperset()Trả về True nếu set này chứa các phần tử của set khác
set.pop()Loại bỏ và trả về một phần tử tùy ý.Tạo ra keyError nếu set rỗng
set.remove()Loại bỏ một phần tử khỏi set. Nếu phần tử không tồn tại tạo ra KeyError
set.symmetric_difference()Trả về set mới chứa phần tử khác biệt đối xứng giữa 2 set
set.symmetric_difference_update()Cập nhật một set với các phần tử khác biệt đối xứng giữa nó và set khác
set.union()Trả về sự kết hợp của các set trong một set mới
set.update()Cập nhật các thiết lập với sự kết hợp của chính nó và set khác

1. set.add(element) 

Thêm một đối tượng element vào setelement phải là đối tượng immutable. Nếu element đã có trong setelement sẽ không được thêm vào.
>>> a = {1, 2, 3}
>>> a.add(4)
>>> a
{1, 2, 3, 4}

2. Set.clear() 

Phương thức này loại bỏ tất cả các phần tử của set.
>>> a = {1, 2, 3, 4}
>>> a.clear()
>>> a
{}

3. Set.copy()

Trả về một bản sao của set
>>> a  = {1, 2, 3, 4}
>>> b = a.copy()
>>> b
{1, 2, 3, 4}
Bạn cũng có thể sao chép set bằng cách sử dụng toán tử =.Tuy nhiên nó sẽ không tạo ra một đối tượng mới mà sẽ trỏ về giá trị set ban đầu, nên khi bạn thay đổi new_set thì set cũng sẽ bị thay đổi.
>>> a  = {1, 2, 3, 4}
>>> b = a
>>> b.add(5)
>>>b
{1, 2, 3, 4, 5}
>>>a
{1, 2, 3, 4, 5}

4. Set1.difference(set2[, set3...])

Tương đương với:
set1 - set2 [-set3....]
Phương thức này trả về tập hợp các phần tử có trong set1 nhưng không tồn tại trong 2 hay nhiều set khác.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> a.difference(b)
{1, 2, 3}
>>> a - b
{1, 2, 3}
Bạn cũng có thể chỉ định nhiều hơn 2 set. Khi đó thao tác được thực hiện từ trái sang phải.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> c = {4, 3, 9}
>>> a .difference(b, c)
{1, 2}
>>> a - b - c
{1, 2}

5. Set1.difference_update(set2[,set3...]) 

Phương thức cập nhật giá trị set1 đã loại bỏ các phần tử tìm thấy trong set2 hoặc các set khác.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> a .difference_update(b)
>>> a
{1, 2}
>>> a -= b
{1, 2}

6. Set.discard(element)

Phương thức loại bỏ phần tử element từ set. Nếu element không tồn tại, phương thức sẽ không làm gì thay vì tạo ra một ngoại lệ.
>>> a = {1, 2, 3, 4}
>>> a.discard(4)
>>> a
{1, 2, 3}
>>> a.discard(5)
>>> a
{1, 2, 3}

7. Set1.intersection(set2[, set3....]) 

Tương đương với:
set & set2 [&set3....]
Phương thức tính giao điểm của hai hay nhiều set. hay nói cách khác, phương thức sẽ trả về tập hợp các phần tử đều tồn tại trong 2 hay nhiều set. Nếu không có phần tử nào trả về một set rỗng.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> a.intersection(b)
{4}

8. Set1.intersection_update(set2[, set3...]) 

Hay còn có thể biểu diễn theo các khác
set1 &= set2[&set3.....]
Phương thức cập nhật set1, chỉ giữ lại các phần tử được tìm thấy trong cả hai set.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> a.intersection_update(b)
>>> a 
{4}
>>> a &= b
{4}

9. Set1.isdisjoint(set2) 

Phương thức trả về True nếu set1 và set2 không có phần tử chung, ngượi lại False.
>>> a = {1, 2, 3, 4}
>>> b = {4, 5, 6}
>>> a.isdisjoint(b)
False
>>> a.isdisjoint(b- {4})
True
Nếu phương thức trả về True có nghĩa là phép toán set1 & set2 sẽ trả về set rỗng.
>>> a = {1, 2, 3, 4}
>>> b = {5, 6}
>>> a & b 
set()

10. Set1.issubset(set2) 

Tương đương với:
set1 < set2 ... < setn
Phương thức trả về True nếu set1 là tập hợp con của set2.
>>> a = {1, 2, 3, 4}
>>> b = {1, 2, 3, 4, 5, 6}
>>> a.issubnet(b) 
True
Một set được coi là tập hợp con của chính nó.
>>> a = {1, 2, 3, 4}
>>> a.issubnet(a)
True

11. Set1.issuperset(set2) 

Tương đương với:
set1 > set2  > ..... > setn
Phương thức trả về True nếu set2 là tập hợp con của set1. Ngược lại trả về False
>>> a = {1, 2, 3, 4, 5 ,6}
>>> b = {1, 2, 3, 4}
>>> a.issuperset(b) 
True

12. Set.pop()

Phương thức sẽ loại bỏ và trả về một phần tử được chọn tùy ý từ set. nếu set rỗng, phương thức sẽ tạo ra một ngoại lệ.
>>> a = {1, 2, 3, 4, 5 ,6}
>>> a.pop()
6
>>> b = set()
>>> b.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'

13. Set.remove(element) 

Phương thức loại bỏ phần tử element từ set và tạo ra một ngoại lệ nếu element không tồn tại trong set.
>>> a = {1, 2, 3, 4, 5 ,6}
>>> a.remove(6)
>>> a
{1, 2, 3, 4, 5}
>>> a.remove(7)
Traceback (most recent call last):     
  File "<stdin>", line 1, in <module>  
KeyError: 7                            

14. Set1.symmetric_difference(set2) 

Tương đương với:
set1 ^ set2 ..... ^ setn
Phương thức trả về tập hợp loại bỏ các phần tử chung giữa set1 và set2.
>>> a = {1, 2, 3, 4, 5 ,6}
>>> b = {5 ,6, 7, 8}
>>> a.symmetric_difference(b)
{1, 2, 3, 4, 7, 8}

15. Set1.symmtric_diffence_update(set2)

Phương thức cập nhật set1 loại bỏ các phần tử giống nhau giữa set1 và set2 hoặc giữa set1 và các set khác.
>>> a = {1, 2, 3, 4, 5 ,6}
>>> b = {5 ,6, 7, 8}
>>> a.symmetric_difference_update(b)
>>> a
{1, 2, 3, 4, 7, 8}

16. Set1.union(set2[, set3....]) 

Tương đương với:
Set1 | set2 [| set3...]
Phương thức trả về tập hợp tồn tại trong cả hai hay nhiều set.
>>> a = {1, 2, 3, 4, 5 ,6}
>>> b = {5 ,6, 7, 8}
>>> c = {9, 10}
>>> a.union(b, c)
{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10}
>>> a | b | c
{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10}

17. S1.update(set2[, set3....]) 

Tương tự với:
Set1 |= set2 [| set3.....]
Phương thức thêm vào set1 những phần tử có trong nhưng set khác mà không có trong set1 và không có giá trị trả về (trả về None) . Nếu bạn muốn thêm các tập hợp mà không phải set(như liststringtupledict...) bạn chỉ cần dùng cú pháp:
set.update(set(X))
# Hoặc
set.update(X)
#  X có thể là list, string...
>>> a = {1, 2, 3, 4, 5 ,6}
>>> b = {5 ,6, 7, 8}
>>> c = {9, 10}
>>> a.update(b, c)
>>> a 
{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10}
>>> a |= b | c
>>> a 
{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10}

Các hàm dựng sẵn trong Python với set

HàmMiêu tả
all()Trả về True nếu tất cả các phần tử của set là True, hoặc nếu set rỗng.
any()Trả về True nếu bất kì phần tử của set là True, hoặc nếu set rỗng trả về False
enumerate()Trả lại một đối tượng liệt kê. Nó chứa chỉ mục và giá trị của tất cả các mục được đặt thành một cặp.
len()Trả về độ lớn của set
max()Trả về phần tử lớn nhất của set
min()Trả về phần tử nhỏ nhất của set
sorted()Trả về một set được sắp xếp
sum()Trả về tổng của các phần tử trong set

Tại sao lại là set

Set trong python được triển khai như một kiểu chứa dữ liệu nhưng có thể sử dụng các phương thức tính toán như trong toán học, thuận tiện cho việc lọc dữ liệu. Ví dụ như:
  • Lọc các phần tử trùng lặp trong list
>>> a  = [1, 2, 3, 4, 2, 3, 6]
>>> list(set(a))
[1, 2, 3, 4, 6]
  • Hay các phép loại bỏ khác
>>> set([1, 3, 5, 7]) - set([1, 2, 4, 5, 6]) 
# Tìm các phần tử khác nhau trong 2 list
{3, 7}
>>> set('abcdefg') - set('abdghij') 
# Tìm các phần tử khác nhau trong 2 tring
{'c', 'e', 'f'}
>>> set('spam') - set(['h', 'a', 'm'])
{'p', 's'}
>>> set(dir(bytes)) - set(dir(bytearray))
{'__getnewargs__'}
>>> set(dir(bytearray)) - set(dir(bytes))
{'append', 'copy', '__alloc__', '__imul__', 
'remove', 'pop', 'insert',....}
Set trong Python Reviewed by Finn on December 17, 2018 Rating: 5

No comments:

Copyright © 0xpan's Blog 2018
Online:
Development by Nguyễn Nam Hồng + Finn