Nếu bạn là người mới bắt đầu học Python, rất có thể bạn đã bắt gặp các danh sách. Nhưng bạn đã nghe nói về bộ trong Python chưa?
Trong hướng dẫn này, chúng ta sẽ khám phá bộ là gì, cách tạo chúng và các thao tác khác nhau mà bạn có thể sử dụng trên chúng.
Trong Python, các tập hợp giống hệt như các danh sách ngoại trừ thực tế là các phần tử của chúng là bất biến (điều đó có nghĩa là bạn không thể thay đổi/biến đổi một phần tử của tập hợp sau khi đã khai báo). Tuy nhiên, bạn có thể thêm/xóa các phần tử khỏi tập hợp.
Nếu điều đó gây nhầm lẫn, hãy để tôi thử và tóm tắt:
Một tập hợp là một nhóm các phần tử có thể thay đổi, không có thứ tự, trong đó bản thân các phần tử là bất biến.
Một đặc điểm khác của một tập hợp là nó có thể bao gồm các phần tử thuộc các kiểu khác nhau. Điều này có nghĩa là bạn có thể có một nhóm số, chuỗi và thậm chí cả bộ, tất cả trong cùng một bộ!
Cách phổ biến nhất để tạo một bộ trong Python là sử dụng công cụ tích hợp sẵn set()
chức năng.
>>> first_set = set(("Connor", 32, (1, 2, 3)))
>>> first_set
{32, 'Connor', (1, 2, 3)}
>>>
>>> second_set = set("Connor")
>>> second_set
{'n', 'C', 'r', 'o'}
Bạn cũng có thể tạo các bộ bằng cách sử dụng dấu ngoặc nhọn {}
cú pháp:
>>> third_set = {"Apples", ("Bananas", "Oranges")}
>>> type(third_set)
<class 'set'>
Các set()
chức năng mất trong một lặp đi lặp lại và đưa ra một danh sách các đối tượng sẽ được chèn vào tập hợp. Các {}
cú pháp tự đặt các đối tượng vào tập hợp.
Như bạn có thể đã nhận ra, cho dù bạn sử dụng set()
chức năng hoặc {}
để tạo một tập hợp, mỗi phần tử cần phải là một đối tượng bất biến. Vì vậy, nếu bạn thêm một danh sách (là một đối tượng có thể thay đổi) vào một tập hợp, bạn sẽ gặp lỗi:
>>> incorrect_set = {"Apples", ["Bananas", "Oranges"]}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
Chúng ta đã biết rằng các tập hợp có thể thay đổi. Điều này có nghĩa là bạn có thể thêm/bớt các phần tử trong một tập hợp.
Đây là một ví dụ về việc thêm các phần tử vào một tập hợp bằng cách sử dụng update()
chức năng.
>>> add_set = set((1, 2, 3, 4))
>>> add_set
{1, 2, 3, 4}
>>>
>>> add_set.update((1,))
>>> add_set
{1, 2, 3, 4}
>>> add_set.update(("cello", "violin"))
>>> add_set
{1, 2, 3, 4, 'violin', 'cello'}
Nhưng hãy lưu ý rằng không có gì thay đổi khi chúng tôi cố gắng thêm lại “cello” vào bộ:
>>> add_set.update(("cello",))
>>> add_Set
{1, 2, 3, 4, 'violin', 'cello'}
Điều này là do các bộ trong Python không thể chứa các bản sao. Vì vậy, khi chúng tôi cố gắng thêm "cello"
lại tập hợp, Python nhận ra rằng chúng tôi đang cố gắng thêm một phần tử trùng lặp và không cập nhật tập hợp. Đây là một lưu ý giúp phân biệt tập hợp với danh sách.
Đây là cách bạn xóa các phần tử khỏi một tập hợp:
>>> sub_set = add_set
>>> sub_set.remove("violin")
>>> sub_set
{1, 2, 3, 4, 'cello'}
Các remove(x)
hàm loại bỏ phần tử x
từ một tập hợp. Nó trả về một KeyError
nếu x
không phải là một phần của tập hợp:
>>> sub_set.remove("guitar")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'guitar'
Có một số cách khác để xóa (các) phần tử khỏi tập hợp:
- các
discard(x)
phương pháp loại bỏx
từ bộ, nhưng không đưa ra bất kỳ lỗi nào nếux
không có mặt trong tập hợp. - các
pop()
phương thức loại bỏ và trả về một phần tử ngẫu nhiên từ tập hợp. - các
clear()
phương thức xóa tất cả các phần tử khỏi một tập hợp
Dưới đây là một số ví dụ để minh họa:
>>> m_set = set((1, 2, 3, 4))
>>>
>>> m_set.discard(5) # no error raised even though '5' is not present in the set
>>>
>>> m_set.pop()
4
>>> m_set
{1, 2, 3}
>>>
>>> m_set.clear()
>>> m_set
set()
Nếu bạn còn nhớ môn toán cơ bản ở trường trung học, có lẽ bạn sẽ nhớ lại các phép toán tập hợp toán học như liên hiệp, ngã tư, Sự khác biệt và chênh lệch đối xứng. Chà, bạn có thể đạt được điều tương tự với các bộ Python.
1. Đặt liên minh
Hợp của hai tập hợp là tập hợp tất cả các yếu tố của cả hai bộ mà không có bản sao. Bạn có thể dùng union()
phương pháp hoặc |
cú pháp để tìm sự kết hợp của một bộ Python.
>>> first_set = {1, 2, 3}
>>> second_set = {3, 4, 5}
>>> first_set.union(second_set)
{1, 2, 3, 4, 5}
>>>
>>> first_set | second_set # using the `|` operator
{1, 2, 3, 4, 5}
2. Đặt giao lộ
Giao của hai tập hợp là tập hợp tất cả các yếu tố phổ biến của cả hai tập hợp. Bạn có thể dùng intersection()
phương pháp của &
toán tử để tìm giao điểm của một tập hợp Python.
>>> first_set = {1, 2, 3, 4, 5, 6}
>>> second_set = {4, 5, 6, 7, 8, 9}
>>> first_set.intersection(second_set)
{4, 5, 6}
>>>
>>> first_set & second_set # using the `&` operator
{4, 5, 6}
3. Đặt sự khác biệt
Hiệu của hai tập hợp là tập hợp có tất cả các phần tử của tập hợp thứ nhất không có mặt trong tập thứ hai. Bạn sẽ sử dụng difference()
phương pháp hoặc -
toán tử để đạt được điều này trong Python.
>>> first_set = {1, 2, 3, 4, 5, 6}
>>> second_set = {4, 5, 6, 7, 8, 9}
>>> first_set.difference(second_set)
{1, 2, 3}
>>>
>>> first_set - second_set # using the `-` operator
{1, 2, 3}
>>>
>>> second_set - first_set
{8, 9, 7}
4. Đặt chênh lệch đối xứng
Hiệu đối xứng giữa hai tập hợp là tập hợp gồm tất cả các phần tử hoặc trong bộ đầu tiên hoặc bộ thứ hai nhưng không phải trong cả hai.
Bạn có quyền lựa chọn sử dụng một trong hai symmetric_difference()
phương pháp hoặc ^
toán tử để làm điều này trong Python.
>>> first_set = {1, 2, 3, 4, 5, 6}
>>> second_set = {4, 5, 6, 7, 8, 9}
>>> first_set.symmetric_difference(second_set)
{1, 2, 3, 7, 8, 9}
>>>
>>> first_set ^ second_set # using the `^` operator
{1, 2, 3, 7, 8, 9}
Mỗi set()
các hoạt động mà chúng ta đã thảo luận ở trên có thể được sử dụng để biến đổi một bộ Python hiện có. Tương tự như cách bạn sẽ sử dụng cú pháp gán tăng cường, chẳng hạn như +=
hoặc *=
để cập nhật một biến, bạn có thể làm tương tự cho các bộ:
>>> a = {1, 2, 3, 4, 5, 6}
>>> b = {4, 5, 6, 7, 8, 9}
>>>
>>> a.update(b) # a "union" operation
>>> a
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>>
>>> a &= b # the "intersection" operation
>>> a
{4, 5, 6, 7, 8, 9}
>>>
>>> a -= set((7, 8, 9)) # the "difference" operation
>>> a
{4, 5, 6}
>>>
>>> a ^= b # the "symmetric difference" operation
>>> a
{7, 8, 9}
Đây không phải là quá phổ biến, nhưng chúng rất hữu ích trong việc xem cách các tập hợp liên quan đến những người khác.
- các
a.issubset(b)
phương pháp hoặc<=
toán tử trả về true nếua
là một tập hợp con củab
- các
a.issuperset(b)
phương pháp hoặc>=
toán tử trả về true nếua
là một bộ siêu tập củab
- các
a.isdisjoint(b)
phương thức trả về true nếu có không có phần tử chung giữa các bộa
vàb
Vì các bộ có thể thay đổi nên chúng không thể băm được – nghĩa là bạn không thể sử dụng chúng làm khóa từ điển.
Python cho phép bạn giải quyết vấn đề này bằng cách sử dụng một frozenset
thay thế. Cái này có tất cả các thuộc tính của một tập hợp, ngoại trừ việc nó là bất biến (điều này có nghĩa là bạn không thể thêm/xóa các phần tử khỏi Frozenset). Nó cũng có thể băm được, vì vậy nó có thể được sử dụng làm chìa khóa cho từ điển.
Các frozenset
kiểu dữ liệu có tất cả các phương thức của một tập hợp (chẳng hạn như difference()
, symmetric_difference
và union
) nhưng vì nó là bất biến nên nó không có phương thức để thêm/xóa phần tử.
>>> a = frozenset((1, 2, 3, 4))
>>> b = frozenset((3, 4, 5, 6))
>>>
>>> a.issubset(b)
False
>>> a.update(b) # raises an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'update'
Và sử dụng frozenset
s như các khóa từ điển đơn giản như 1, 2, 3:
>>> a = frozenset((1, 2, 3, 4))
>>> b = frozenset(("w", "x", "y", "z"))
>>>
>>> d = {a: "hello", b: "world"}
>>> d
{frozenset({1, 2, 3, 4}): 'hello', frozenset({'w', 'x', 'y', 'z'}): 'world'}
Đó là nó! Bạn đã tìm hiểu về tập hợp là gì, cách tạo và làm việc với chúng cũng như các thao tác khác nhau mà bạn có thể sử dụng trên chúng.
Với các bộ đã hoàn thành, giờ đây bạn sẽ cảm thấy thoải mái với hầu hết các hàm tích hợp sẵn của Python. Tất cả những gì bạn cần làm bây giờ là luyện tập. Chúc may mắn!
Chắc chắn rằng theo dõi tôi trên Twitter để biết thêm thông tin cập nhật. Có một cái tốt đẹp!