Kiểu dữ liệu tập hợp Set trong Python

<p style="text-align: justify;">Trong c&aacute;c b&agrave;i trước, ch&uacute;ng ta đ&atilde; l&agrave;m quen với hai kiểu dữ liệu tập hợp được sử dụng phổ biến trong Python l&agrave; kiểu dữ liệu danh s&aacute;ch v&agrave; kiểu dữ liệu tuple. Đ&acirc;y l&agrave; hai kiểu dữ liệu c&oacute; thứ tự v&agrave; được truy cập th&ocirc;ng qua c&aacute;c chỉ số. Tuy nhi&ecirc;n, Python c&ograve;n hỗ trợ một số kiểu dữ liệu kh&aacute;c kh&aacute; đặc biệt được sử dụng trong nhiều trường hợp đ&oacute; l&agrave; kiểu dữ liệu tập hợp set v&agrave; kiểu từ điển dictionary.</p> <p style="text-align: justify;">Trong b&agrave;i n&agrave;y ch&uacute;ng ta sẽ t&igrave;m hiểu về kiểu dữ liệu tập hợp Set trong Python, c&aacute;ch khởi tạo, th&ecirc;m hoặc x&oacute;a c&aacute;c phần tử v&agrave; c&aacute;c thao t&aacute;c được thực hiện tr&ecirc;n c&aacute;c tập hợp Set.</p> <h2 style="text-align: justify;">Kiểu dữ liệu tập hợp set trong Python</h2> <p style="text-align: justify;">Trong Python, một tập hợp set l&agrave; một tập hợp dữ liệu kh&ocirc;ng c&oacute; thứ tự v&agrave; mỗi phần tử trong tập được x&aacute;c định duy nhất, kh&ocirc;ng cho ph&eacute;p sự tr&ugrave;ng lặp.</p> <p style="text-align: justify;">Kh&ocirc;ng giống như kiểu danh s&aacute;ch List hay Tuple, Kiểu tập hợp Set kh&ocirc;ng c&oacute; thứ tự, điều đ&oacute; c&oacute; nghĩa l&agrave; ch&uacute;ng ta sẽ kh&ocirc;ng thể truy cập c&aacute;c phần tử của n&oacute; th&ocirc;ng qua chỉ số, hay cũng kh&ocirc;ng thể th&ecirc;m một phần tử v&agrave;o một "vị tr&iacute;" n&agrave;o đ&oacute; th&ocirc;ng qua chỉ số được.</p> <p style="text-align: justify;">T&oacute;m lại 3 đặc t&iacute;nh cơ bản của kiểu tập hợp set bao gồm:</p> <ul> <li style="text-align: justify;">Kh&ocirc;ng c&oacute; thứ tự: c&aacute;c phần tử kh&ocirc;ng được xếp thứ tự v&agrave; khi ch&uacute;ng ta th&ecirc;m một phần tử th&igrave; n&oacute; cũng kh&ocirc;ng cần đảm bảo thứ tự. Mỗi phần tử sẽ ở thứ tự kh&aacute;c nhau mỗi khi ch&uacute;ng ta truy cập v&agrave;o n&oacute;. Kh&ocirc;ng c&oacute; c&aacute;c chỉ số để x&aacute;c định vị tr&iacute; của phần tử v&agrave; kh&ocirc;ng thể truy cập th&ocirc;ng qua chỉ số.</li> <li style="text-align: justify;">Bất biến: C&aacute;c phần tử trong set c&oacute; t&iacute;nh bất biến. Nghĩa l&agrave; ch&uacute;ng ta kh&ocirc;ng thể thay đổi gi&aacute; trị của c&aacute;c phần tử n&agrave;y. Điều n&agrave;y giống với Tuple. Tuy nhi&ecirc;n, Set lại cho ph&eacute;p th&ecirc;m hoặc loại bỏ c&aacute;c phần tử khỏi n&oacute;, tức l&agrave; n&oacute; chỉ giới hạn việc sửa chữa nội dung của phần tử chứ kh&ocirc;ng giới hạn việc th&ecirc;m hoặc x&oacute;a.</li> <li style="text-align: justify;">Kh&ocirc;ng cho ph&eacute;p tr&ugrave;ng lặp: C&aacute;c phần tử trong tập hợp set kh&ocirc;ng được giống nhau, kh&ocirc;ng thể c&oacute; 2 phần tử c&oacute; gi&aacute; trị giống nhau nằm trong set.</li> </ul> <p style="text-align: justify;">Tập hợp Set l&agrave; một tập hợp c&aacute;c phần tử kh&ocirc;ng c&oacute; thứ tự. Mọi phần tử trong tập hợp Set l&agrave; duy nhất (kh&ocirc;ng tr&ugrave;ng lặp) v&agrave; c&oacute; t&iacute;nh bất biến (kh&ocirc;ng thể thay đổi). Tuy nhi&ecirc;n, bản th&acirc;n một tập hợp Set c&oacute; thể thay đổi. Ch&uacute;ng ta c&oacute; thể th&ecirc;m hoặc x&oacute;a c&aacute;c phần tử. C&aacute;c tập hợp Set cũng c&oacute; thể được sử dụng để thực hiện c&aacute;c ph&eacute;p to&aacute;n tập hợp như li&ecirc;n hợp, tập giao, sự kh&aacute;c biệt giữa hai tập hợp,...Dưới d&acirc;y, ch&uacute;ng ta sẽ đi chi tiết v&agrave;o c&aacute;c thao t&aacute;c cơ bản tr&ecirc;n tập hợp set trong Python.</p> <h2 style="text-align: justify;">Tạo tập hợp Set trong Python</h2> <p style="text-align: justify;">C&oacute; hai c&aacute;ch để tạo một tập hợp set trong Python, đ&oacute; l&agrave;:</p> <ul> <li style="text-align: justify;">Sử dụng dấu ngoặc nhọn {}. Một tập hợp Set c&oacute; thể dễ d&agrave;ng được tạo bằng c&aacute;ch đặt tất cả c&aacute;c phần tử b&ecirc;n trong dấu ngoặc nhọn {}, được ph&acirc;n t&aacute;ch bằng dấu phẩy. Lưu &yacute; rằng, c&aacute;c phần tử trong tập n&agrave;y phải kh&aacute;c nhau.</li> <li style="text-align: justify;">Sử dụng h&agrave;m tạo <code class="EnlighterJSRAW" data-enlighter-language="generic">set()</code> đ&atilde; được t&iacute;ch hợp sẵn. Điều n&agrave;y được thực hiện tương tự như &eacute;p kiểu, ch&uacute;ng ta c&oacute; thể đưa c&aacute;c kiểu dữ liệu tập hợp kh&aacute;c về kiểu set bằng c&aacute;ch truyền n&oacute; v&agrave;o tham số của h&agrave;m set trong cặp dấu ngoặc tr&ograve;n ().</li> </ul> <p style="text-align: justify;">Ch&uacute;ng ta c&ugrave;ng xem x&eacute;t v&iacute; dụ dưới đ&acirc;y.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>sample_set1 = {'Python', 'TEK4.VN', 11, 20.1, 11} print(sample_set1) sample_set2 = {200.5, "Python", (200, 300, 400)} print(sample_set2) name_set = set(("H&ugrave;ng", "Huy", "Hải")) print(name_set) print(type(name_set)) p_set=set([1,2,3,1,2,3]) print(p_set)</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>{'TEK4.VN', 11, 20.1, 'Python'} {200.5, 'Python', (200, 300, 400)} {'H&ugrave;ng', 'Huy', 'Hải'} &lt;class 'set'&gt; {1, 2, 3}</code></pre> <p style="text-align: justify;">Nh&igrave;n từ kết quả hiển thị ta thấy:</p> <ul> <li style="text-align: justify;">C&aacute;c dữ liệu n&agrave;y kh&ocirc;ng được xếp thứ tự ! Thứ tự hiển thị ở đầu ra kh&aacute;c ho&agrave;n to&agrave;n so với thứ tự khởi tạo.</li> <li style="text-align: justify;">Khi xuất hiện dữ liệu tr&ugrave;ng lặp, dữ liệu tr&ugrave;ng sẽ tự động bị loại bỏ v&agrave; chỉ giữ lại một gi&aacute; trị tồn tại l&agrave;m phần tử của set</li> <li style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể tạo set từ c&aacute;c danh s&aacute;ch list khi đ&oacute; mỗi phần tử của list sẽ được chuyển th&agrave;nh phần tử của set, v&agrave; c&aacute;c phần tử tr&ugrave;ng lặp sẽ bị loại bỏ. &Agrave;, đến đ&acirc;y chắc hẳn c&aacute;c bạn sẽ nghĩ ra một c&aacute;ch gi&aacute;i rất hay cho b&agrave;i to&aacute;n x&aacute;c định c&aacute;c phần tử duy nhất trong một danh s&aacute;ch rồi phải kh&ocirc;ng? Bạn c&oacute; thể thử xem!!! Đ&acirc;y l&agrave; một b&agrave;i tập nhỏ rất hữu &iacute;ch cho bạn. Chỉ cần đ&uacute;ng 1 c&acirc;u lệnh thay v&igrave; duyệt nhiều vong for qua danh s&aacute;ch!!!! Thật tuyệt vời phải kh&ocirc;ng ạ! Đ&oacute; l&agrave; một trong những ưu điểm của Python.</li> </ul> <p style="text-align: justify;">Trong đoạn m&atilde; tr&ecirc;n, ch&uacute;ng ta thấy rằng kiểu tập hợp set cũng l&agrave; một cấu tr&uacute;c dữ liệu dạng hỗn tạp, tức l&agrave; n&oacute; cho ph&eacute;p nhận c&aacute;c phần tử thuộc bất cứ kiểu dữ liệu n&agrave;o kh&aacute;c, c&oacute; thể l&agrave; số nguy&ecirc;n, số thực, chuỗi k&yacute; tự hay tuple,...</p> <p style="text-align: justify;">Tuy nhi&ecirc;n lưu &yacute; rằng, khi tạo tập hợp set, n&oacute; kh&ocirc;ng được ph&eacute;p chứa c&aacute;c phần tử thuộc kiểu dữ liệu c&oacute; thể thay đổi được như danh s&aacute;ch (List) hoặc từ điển (Dictionary). Khi sử dụng c&aacute;c kiểu n&agrave;y trong set, chương tr&igrave;nh sẽ b&aacute;o lỗi.</p> <p>V&iacute; dụ, đoạn m&atilde; sau sẽ đưa ra th&ocirc;ng b&aacute;o lỗi:</p> <pre class="language-python"><code>sample_set = {'Python', 'TEK4.VN', [15, 71, 22]} print(sample_set)</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>TypeError: unhashable type: 'list'</code></pre> <p style="text-align: justify;">Điều n&agrave;y ho&agrave;n to&agrave;n kh&aacute;c với kiểu tuple. Tuple mặc d&ugrave; kh&ocirc;ng cho thay đổi, nhưng lại cho ph&eacute;p thay đổi c&aacute;c phần tử dạng thay đổi được như List hay Dictionary nằm trong n&oacute;!</p> <h2>&nbsp;X&aacute;c định số phần tử của Set</h2> <p style="text-align: justify;"><span style="font-weight: 400;">Để x&aacute;c định số phần tử của một đối tượng Set, ch&uacute;ng ta c&oacute; thể sử dụng phương thức len() tương tự như với c&aacute;c kiểu dữ liệu chuỗi v&agrave; tập hợp kh&aacute;c trong Python. Phương thức n&agrave;y y&ecirc;u cầu một tham số được truyền v&agrave;o, t&ecirc;n của Set.</span></p> <pre class="language-python" tabindex="0"><code>language_set = {"Python", "Java", "C++"} print(len(language_set))</code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Như ch&uacute;ng ta c&oacute; thể thấy trong kết quả ở tr&ecirc;n, phương thức len() trả về một số nguy&ecirc;n c&oacute; gi&aacute; trị l&agrave; 3. Gi&aacute; trị n&agrave;y bằng với số lượng phần tử c&oacute; trong Set.</span></p> <h2 style="text-align: justify;">Truy cập v&agrave; duyệt c&aacute;c phần tử trong tập hợp set</h2> <p style="text-align: justify;">C&aacute;c phần tử trong tập hợp set kh&ocirc;ng c&oacute; thứ tự v&agrave; do đ&oacute;, ch&uacute;ng cũng kh&ocirc;ng c&oacute; chỉ số. V&igrave; vậy, ch&uacute;ng ta sẽ kh&ocirc;ng thể truy cập từng phần tử bằng chỉ số của n&oacute;, cũng như kh&ocirc;ng thể thực hiện việc cắt c&aacute;c tập con bằng ph&eacute;p cắt dựa tr&ecirc;n chỉ số sử dụng dấu hai chấm (:).</p> <p style="text-align: justify;">T&oacute;m lại những g&igrave; dựa tr&ecirc;n chỉ số th&igrave; kh&ocirc;ng d&ugrave;ng được trong kiểu tập hợp set.</p> <p style="text-align: justify;">Để truy cập v&agrave;o c&aacute;c phần tử của set, ch&uacute;ng ta cần thực hiện một v&ograve;ng lặp để duyệt qua to&agrave;n bộ c&aacute;c phần tử của n&oacute;. V&agrave; tất nhi&ecirc;n, kh&ocirc;ng c&oacute; chỉ số do đ&oacute;, ch&uacute;ng ta buộc phải sử dụng v&ograve;ng lặp <code>for</code>.</p> <pre class="language-python"><code>language_set = {"Python", "Java", "C++"} for l in language_set: print(l)</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>Python C++ Java</code></pre> <p style="text-align: justify;">Như ch&uacute;ng ta c&oacute; thể thấy ở kết quả đầu ra, thứ tự của c&aacute;c phần tử kh&ocirc;ng giống như khi ch&uacute;ng ta th&ecirc;m v&agrave;o. V&agrave; nếu ch&uacute;ng ta bấm chạy lại chương tr&igrave;nh một lần nữa th&igrave; kết quả cũng ra ho&agrave;n to&agrave;n kh&aacute;c:</p> <pre class="language-markup"><code>Java Python C++</code></pre> <p style="text-align: justify;">Mỗi lần kết quả sẽ ra những thứ tự kh&aacute;c nhau. Đ&oacute; l&agrave; điểm đặc biệt của kiểu tập hợp set trong Python. Trong kiểu tập hợp set, kh&ocirc;ng c&oacute; kh&aacute;i niệm thứ tự !</p> <h2 style="text-align: justify;">Th&ecirc;m phần tử v&agrave;o tập hợp Set</h2> <p style="text-align: justify;">Ch&uacute;ng ta đ&atilde; n&oacute;i ở tr&ecirc;n rằng tập hợp set c&oacute; t&iacute;nh bất biến, điều n&agrave;y lại chỉ đ&uacute;ng với gi&aacute; trị của c&aacute;c phần tử trong set bởi kh&ocirc;ng c&oacute; chỉ số, do đ&oacute; kh&ocirc;ng thể truy cập v&agrave;o để thay đổi n&oacute;. C&ograve;n đối với tập hợp set ch&uacute;ng ta c&oacute; thể thực hiện việc thay đổi n&oacute; bằng c&aacute;c thao t&aacute;c th&ecirc;m (sử dụng phương thức add()) v&agrave; cập nhật (sử dụng phương thức update()).</p> <p style="text-align: justify;">Ch&uacute;ng ta c&oacute; thể th&ecirc;m một phần tử bằng phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">add()</code> v&agrave; nhiều phần tử bằng phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">update()</code>. Phương thức update() c&oacute; thể lấy tập hợp Tuple, List, chuỗi k&yacute; tự hoặc c&aacute;c tập hợp kh&aacute;c l&agrave;m đối số của n&oacute;. Trong mọi trường hợp, tất c&aacute;c gi&aacute; trị giống nhau sẽ bị loại bỏ.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>a = {321, 193} print(a) a.add(360) print(a) a.update([240, 320, 410]) print(a) a.update([411, 520], {150, 630, 890}) print(a)</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>{321, 193} {360, 321, 193} {320, 321, 193, 360, 240, 410} {320, 321, 193, 360, 520, 240, 630, 150, 410, 411, 890}</code></pre> <h2 style="text-align: justify;">X&oacute;a phần tử khỏi tập hợp Set</h2> <p style="text-align: justify;">Một phần tử c&oacute; thể bị x&oacute;a khỏi tập hợp Set bằng c&aacute;ch sử dụng c&aacute;c phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">discard()</code> hoặc <code class="EnlighterJSRAW" data-enlighter-language="generic">remove()</code>.</p> <p style="text-align: justify;">Sự kh&aacute;c biệt duy nhất giữa hai h&agrave;m l&agrave; h&agrave;m discard() giữ nguy&ecirc;n một tập hợp Set nếu phần tử kh&ocirc;ng c&oacute; trong tập hợp đ&oacute;. Mặt kh&aacute;c, h&agrave;m remove() sẽ đưa ra lỗi trong c&ugrave;ng trường hợp như vậy (nếu phần tử kh&ocirc;ng c&oacute; trong tập hợp).</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>a = {130, 320, 410, 630} print(a) a.discard(130) print(a) a.discard(330) print(a) a.remove(120) print(a)</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>{320, 130, 630, 410} {320, 630, 410} {320, 630, 410} Traceback (most recent call last): File "e:/Learning/IT/Python/Bai2.py", line 7, in &lt;module&gt; a.remove(120) KeyError: 120</code></pre> <p>Ta thấy rằng, c&acirc;u lệnh ở d&ograve;ng thứ 5 discard(330) vẫn hợp lệ kh&ocirc;ng b&aacute;o lỗi v&agrave; vẫn hoạt động b&igrave;nh thường, n&oacute; chỉ trả lại tập hợp như cũ kh&ocirc;ng c&oacute; thay đổi g&igrave;, c&ograve;n lại c&acirc;u lệnh thứ 7 remove(120), do 120 kh&ocirc;ng c&oacute; trong tập hợp a, n&ecirc;n n&oacute; kh&ocirc;ng thực hiện được v&agrave; sẽ b&aacute;o lỗi.</p> <p style="text-align: justify;">Tương tự, ch&uacute;ng ta c&oacute; thể x&oacute;a v&agrave; trả lại một phần tử bằng phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">pop()</code>.</p> <pre class="language-python"><code>a = {130, 320, 410, 630} deleted_item = a.pop() print(deleted_item)</code></pre> <p>Lưu &yacute;, do set l&agrave; tập kh&ocirc;ng c&oacute; thứ tự n&ecirc;n n&oacute; kh&ocirc;ng c&oacute; chỉ số v&agrave; cũng kh&ocirc;ng c&oacute; phần tử đầu, cuối,...do đ&oacute; c&acirc;u lệnh pop sẽ trả ra một phần tử ngẫu nhi&ecirc;n từ set.</p> <p>Kết quả cho ta:</p> <pre class="language-markup"><code>320</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta cũng c&oacute; thể x&oacute;a tất cả c&aacute;c phần tử khỏi một tập hợp Set bằng phương thức <code class="EnlighterJSRAW" data-enlighter-language="generic">clear()</code>. Hoặc x&oacute;a bỏ to&agrave;n bộ set trong chương tr&igrave;nh sử dụng phương thức del().</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>a = {130, 320, 410, 630} print(a) a.clear() print(a) del a</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>{320, 130, 630, 410} set()</code></pre> <p>T&oacute;m lại, để <span style="font-weight: 400;">x&oacute;a c&aacute;c phần tử khỏi đối tượng Set, ch&uacute;ng ta c&oacute; thể sử dụng bất kỳ một trong c&aacute;c phương thức sau:</span></p> <table style="border-collapse: collapse; margin-left: auto; margin-right: auto;"> <tbody> <tr> <td> <p><span style="font-weight: 400;">Phương thức</span></p> </td> <td> <p><span style="font-weight: 400;">M&ocirc; tả</span></p> </td> </tr> <tr> <td> <p><span style="font-weight: 400;">remove()</span></p> </td> <td> <p><span style="font-weight: 400;">Để x&oacute;a một phần tử khỏi đối tượng Set. Phương thức n&agrave;y sẽ nhận v&agrave;o một tham số, l&agrave; phần tử sẽ được x&oacute;a khỏi Set. Phương thức n&agrave;y sẽ đưa ra lỗi keyerror nếu một phần tử kh&ocirc;ng tồn tại trong đối tượng Set</span></p> </td> </tr> <tr> <td> <p><span style="font-weight: 400;">discard()</span></p> </td> <td> <p><span style="font-weight: 400;">Để loại bỏ một phần tử duy nhất c&oacute; thể c&oacute; hoặc kh&ocirc;ng c&oacute; trong Set. Phương thức n&agrave;y nhận v&agrave;o một tham số, l&agrave; phần tử cần loại bỏ. Nếu phần tử đ&oacute; c&oacute; tồn tại, n&oacute; sẽ được loại bỏ.</span></p> </td> </tr> <tr> <td> <p><span style="font-weight: 400;">pop()</span></p> </td> <td> <p><span style="font-weight: 400;">X&oacute;a một phần tử bất kỳ ngẫu nhi&ecirc;n khỏi Set</span></p> </td> </tr> <tr> <td> <p><span style="font-weight: 400;">clear()</span></p> </td> <td> <p><span style="font-weight: 400;">X&oacute;a tất cả c&aacute;c phần tử khỏi Set. Kết quả đầu ra l&agrave; một đối tượng Set rỗng</span></p> </td> </tr> <tr> <td> <p><span style="font-weight: 400;">del set</span></p> </td> <td> <p><span style="font-weight: 400;">X&oacute;a to&agrave;n bộ đối tượng Set</span></p> </td> </tr> </tbody> </table> <h2><span style="font-weight: 400;"><strong> Sao ch&eacute;p đối tượng Set</strong></span></h2> <p style="text-align: justify;"><span style="font-weight: 400;">Trong Python, ch&uacute;ng ta c&oacute; thể sao ch&eacute;p c&aacute;c phần tử từ đối tượng Set n&agrave;y sang đối tượng Set kh&aacute;c theo ba c&aacute;ch.</span></p> <ol> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Sử dụng phương thức copy().</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Sử dụng h&agrave;m tạo set().</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Sử dụng to&aacute;n tử dấu bằng.</span></li> </ol> <p style="text-align: justify;"><span style="font-weight: 400;">Khi sử dụng to&aacute;n tử = (g&aacute;n), bất kỳ sửa đổi n&agrave;o m&agrave; ch&uacute;ng ta thực hiện trong tập hợp ban đầu sẽ được phản &aacute;nh trong tập hợp mới. Tức l&agrave; tuy hai m&agrave; một. Do đ&oacute;, ch&uacute;ng ta thường hạn chế sử dụng to&aacute;n tử n&agrave;y.<br /></span></p> <p style="text-align: justify;"><span style="font-weight: 400;"> Khi sử dụng phương thức copy(), tập hợp Set mới sẽ kh&ocirc;ng phản &aacute;nh những thay đổi của tập hợp Set ban đầu.<br /></span></p> <p style="text-align: justify;"><span style="font-weight: 400;">Khi đặt set2 = set11, ch&uacute;ng ta đặt tham chiếu đến c&ugrave;ng một đối tượng, v&igrave; vậy khi sửa đổi một trong số ch&uacute;ng, tất cả c&aacute;c tham chiếu được li&ecirc;n kết với đối tượng đ&oacute; sẽ phản &aacute;nh trạng th&aacute;i hiện tại của đối tượng. V&igrave; vậy, kh&ocirc;ng sử dụng to&aacute;n tử g&aacute;n để sao ch&eacute;p tập hợp Set, thay v&agrave;o đ&oacute; h&atilde;y sử dụng phương thức copy() hoặc phương thức khởi tạo set().</span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="language-python" tabindex="0"><code>color_set = {'violet', 'blue', 'green', 'yellow'} color_set2 = color_set.copy() color_set3 = set(color_set) color_set4 = color_set print('Original set:', color_set) color_set.add("red") print('Copy using copy():', color_set2) print('Copy using set(): ', color_set3) print('Copy using =', color_set4)</code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Kết quả:</span></p> <pre class="language-markup"><code>Original set: {'green', 'yellow', 'blue', 'violet'} Copy using copy(): {'green', 'yellow', 'blue', 'violet'} Copy using set(): {'green', 'yellow', 'blue', 'violet'} Copy using = {'red', 'blue', 'violet', 'green', 'yellow'}</code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Ở đ&acirc;y trong kết quả đầu ra ở tr&ecirc;n, phần tử &lsquo;red&rsquo; được th&ecirc;m v&agrave;o color_set sau khi sao ch&eacute;p nội dung v&agrave;o color_set2, color_set3 v&agrave; color_set4.</span></p> <p style="text-align: justify;"><span style="font-weight: 400;">Ch&uacute;ng ta c&oacute; thể thấy rằng sửa đổi ch&uacute;ng ta đ&atilde; thực hiện trong tập hợp ban đầu sau khi sao ch&eacute;p bị chuyển ho&agrave;n to&agrave;n v&agrave;o trong color_set4 do ch&uacute;ng ta sử dụng to&aacute;n tử to&aacute;n tử =. C&ograve;n với hai c&aacute;ch c&ograve;n lại, điều n&agrave;y kh&ocirc;ng xảy ra.<br /></span></p> <h2><span style="font-weight: 400;"> <strong>Frozenset</strong></span></h2> <p style="text-align: justify;"><span style="font-weight: 400;">Frozenset l&agrave; một tập hợp bất biến. Frozenset l&agrave; một tập hợp kh&ocirc;ng c&oacute; thứ tự chứa c&aacute;c phần tử kh&ocirc;ng thể thay đổi gi&aacute; trị. </span><span style="font-weight: 400;">Ch&uacute;ng ta c&oacute; thể tạo một Frozenset bằng c&aacute;ch sử dụng h&agrave;m <code>frozenset()</code>, nhận v&agrave;o một đối tượng c&oacute; thể lặp lại l&agrave;m tham số.</span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>rainbow = ('violet', 'indigo', 'blue', 'green', 'yellow', 'orange', 'red') f_set = frozenset(rainbow) print(f_set)</code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Như đ&atilde; thấy trong v&iacute; dụ tr&ecirc;n, m&agrave;u sắc của cầu vồng được tạo ra bởi đối tượng Frozenset v&agrave; được đặt b&ecirc;n trong dấu ngoặc nhọn {}. Nếu ch&uacute;ng ta kh&ocirc;ng truyền bất kỳ phần tử n&agrave;o, n&oacute; sẽ trả về một đối tượng Frozenset rỗng.</span></p> <p style="text-align: justify;"><span style="font-weight: 400;">Khi n&agrave;o sử dụng Frozenset?</span></p> <ol> <li style="font-weight: 400; text-align: justify;" aria-level="1"><span style="font-weight: 400;">Khi muốn tạo một tập hợp bất biến kh&ocirc;ng cho ph&eacute;p th&ecirc;m hoặc x&oacute;a c&aacute;c phần tử khỏi một tập hợp.</span></li> <li style="font-weight: 400; text-align: justify;" aria-level="1"><span style="font-weight: 400;">Khi bạn muốn tạo tập hợp Set chỉ đọc.</span></li> </ol> <p style="text-align: justify;"><span style="font-weight: 400;">Nếu ch&uacute;ng ta cố gắng x&oacute;a hoặc th&ecirc;m bất kỳ phần tử n&agrave;o, n&oacute; sẽ đưa ra lỗi v&igrave; một tập hợp Frozen set l&agrave; kh&ocirc;ng thể thay đổi.</span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>rainbow = ('violet', 'indigo', 'blue') f_set = frozenset(rainbow) f_set.add(f_set)</code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Tất cả c&aacute;c ph&eacute;p to&aacute;n được thực hiện trong một tập hợp Set đều c&oacute; thể thực hiện được với Frozenset. Ch&uacute;ng ta cũng c&oacute; thể sử dụng <code>union()</code>, <code>intersection()</code>, <code>difference()</code> v&agrave; <code>symmetric_difference()</code> cho một Frozenset.</span></p> <p style="text-align: justify;"><span style="font-weight: 400;">Tuy nhi&ecirc;n, ch&uacute;ng ta kh&ocirc;ng thể sử dụng <code>intersection_update()</code>, <code>difference_update()</code> v&agrave; <code>symmetric_difference_update()</code> cho Frozenset v&igrave; n&oacute; c&oacute; t&iacute;nh chất bất biến.</span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>colorset1 = frozenset(('violet', 'indigo', 'blue', 'green')) colorset2 = frozenset(('blue', 'green', 'red')) print('The colors of the rainbow are:', colorset1.union(colorset2)) print('The common colors are:', colorset1.intersection(colorset2)) print('The unique colors in first set are:', colorset1.difference(colorset2)) print('The unique colors in second set are:', colorset2.difference(colorset1)) print('The unique colors second set are:', colorset1.symmetric_difference(colorset2))</code></pre> <p style="text-align: justify;">Như vậy, trong b&agrave;i n&agrave;y ch&uacute;ng ta đ&atilde; t&igrave;m hiểu về một số thao t&aacute;c cơ bản tr&ecirc;n dạng dữ liệu tập hợp set. Đến đ&acirc;y, ch&uacute;ng ta h&atilde;y c&ugrave;ng luyện tập đ&ocirc;i ch&uacute;t để nắm vững nội dung kiến thức đ&atilde; học với một số b&agrave;i tập tự luyện.</p>