Kiểu từ điển Dictionary trong Python

<p style="text-align: justify;">Trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ c&ugrave;ng t&igrave;m hiểu về kiểu từ điển Dictionary trong Python. Đ&acirc;y l&agrave; kiểu dữ liệu kh&aacute; đặc biệt trong Python gi&uacute;p ch&uacute;ng ta c&oacute; thể tra cứu c&aacute;c dữ liệu theo kh&oacute;a. Trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ t&igrave;m hiểu về kiểu dữ liệu n&agrave;y, c&aacute;ch thức để tạo cũng như một số phương thức cơ bản tr&ecirc;n n&oacute;.&nbsp;</p> <h2 style="text-align: justify;">Kiểu từ điển dictionary trong Python l&agrave; g&igrave;?</h2> <p style="text-align: justify;"><strong>Kiểu từ điển Dictionary trong Python 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ử của từ điển c&oacute; một cặp kh&oacute;a v&agrave; gi&aacute; trị (key-value). C&aacute;c đối tượng kiểu từ điển được tối ưu h&oacute;a để truy xuất c&aacute;c gi&aacute; trị khi gi&aacute; trị kh&oacute;a được biết.</strong></p> <p style="text-align: justify;">Kiểu dictionary biểu diễn một &aacute;nh xạ quan hệ giữa một kh&oacute;a v&agrave; một gi&aacute; trị. Mỗi dictionary sẽ bao gồm danh s&aacute;ch của c&aacute;c cặp kh&oacute;a v&agrave; gi&aacute; trị. Mỗi kh&oacute;a được li&ecirc;n kết với một gi&aacute; trị cụ thể v&agrave; ch&uacute;ng ta c&oacute; thể truy xuất gi&aacute; trị cụ thể n&agrave;y dựa tr&ecirc;n kh&oacute;a của n&oacute;.</p> <p style="text-align: justify;">Chẳng hạn, ch&uacute;ng ta c&oacute; một danh bạ điện thoại, ch&uacute;ng ta c&oacute; thể dễ d&agrave;ng t&igrave;m được số điện thoại (gi&aacute; trị) khi ch&uacute;ng ta biết t&ecirc;n (kh&oacute;a) tương ứng với n&oacute;.</p> <h3 id="h-characteristics-of-dictionaries" style="text-align: justify;">C&aacute;c t&iacute;nh chất của kiểu dữ liệu từ điển trong Python</h3> <ul> <li style="text-align: justify;"><strong>Kh&ocirc;ng c&oacute; thứ tự</strong>: C&aacute;c phần tử trong từ điển được lưu trữ dưới dạng key-value v&agrave; ch&uacute;ng kh&ocirc;ng c&oacute; thứ tự hay kh&ocirc;ng được đ&aacute;nh chỉ số lần lượt từ 0 đến n. T&iacute;nh chất n&agrave;y giống t&iacute;nh chất của kiểu dữ liệu tập hợp set.</li> <li style="text-align: justify;"><strong>T&iacute;nh duy nhất: </strong>Như đ&atilde; n&oacute;i ở tr&ecirc;n, mỗi gi&aacute; trị sẽ tương ứng với một kh&oacute;a v&agrave; kh&oacute;a n&agrave;y phải l&agrave; duy nhất để tr&aacute;nh nhầm lẫn khi truy cập c&aacute;c gi&aacute; trị. Nếu ch&uacute;ng ta cố t&igrave;nh lưu một gi&aacute; trị với 1 kh&oacute;a đ&atilde; c&oacute; trước đ&oacute;, th&igrave; gi&aacute; trị gần nhất của dữ liệu sẽ được thay thế v&agrave;o gi&aacute; trị cũ.</li> <li style="text-align: justify;"><strong>C&oacute; thể thay đổi được: </strong>Kiểu từ điển c&oacute; thể thay đổi được gi&aacute; trị trong n&oacute; cũng như cho ph&eacute;p th&ecirc;m v&agrave; x&oacute;a c&aacute;c phần tử một c&aacute;ch dễ d&agrave;ng.</li> </ul> <h2 style="text-align: justify;">Tạo đối tượng kiểu dữ liệu từ điển Python</h2> <p>Ch&uacute;ng ta c&oacute; một số c&aacute;ch để tạo ra một đối tượng dữ liệu từ điển trong Python.</p> <ul> <li><strong>Sử dụng cặp ngoặc nhọn</strong>: Ch&uacute;ng ta c&oacute; thể tạo một đối tượng kiểu dictionary bằng c&aacute;ch sử dụng cặp dấu ngoặc nhọn <code>{}</code> v&agrave; trong đ&oacute; chứa c&aacute;c cặp Key: Value ph&acirc;n t&aacute;ch nhau bằng dấu hai chấm &lsquo;<code>:</code>&lsquo;. Dấu hai chấm &lsquo;<code>:</code>&lsquo; được sử dụng để ph&acirc;n t&aacute;ch c&aacute;c cặp Key:Value tương ứng với kh&oacute;a v&agrave; gi&aacute; trị trong từ điển.</li> <li><strong>Sử dụng h&agrave;m tạo <code>dict()</code></strong>:&nbsp; Ch&uacute;ng ta c&oacute; thể tạo một đối tượng từ điển bằng c&aacute;ch truyền v&agrave;o c&aacute;c cặp key: value v&agrave;o tham số của phương thức <code>dict()</code>.</li> <li><strong>Sử dụng một chuỗi c&oacute; dạng c&aacute;c cặp gi&aacute; trị</strong> (key-value)</li> </ul> <p style="text-align: justify;">Mặc d&ugrave; c&aacute;c gi&aacute; trị c&oacute; thể thuộc bất kỳ kiểu dữ liệu n&agrave;o v&agrave; c&oacute; thể lặp lại, nhưng c&aacute;c kh&oacute;a phải thuộc kiểu dữ liệu l&agrave; bất biến (chuỗi k&yacute; tự, số hoặc tập hợp Tuple với c&aacute;c phần tử bất biến) v&agrave; phải l&agrave; duy nhất.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>a = {} print(a) a = {100: 'Hundred', 200: 'Two Hundred', 300: 'Three Hundred'} print(a) a = {'Ten': 'Nam', 'ID': [1, 3]} print(a) a = dict({100: 'Hundred', 200: 'Two Hundred'}) print(a) a = dict([('Nam', 1), ('Trung', 2)]) print(a) a = {"name": "Nam", 10: "Mobile"} print(a)</code></pre> <p style="text-align: justify;">Như c&oacute; thể thấy ở tr&ecirc;n, ch&uacute;ng ta cũng c&oacute; thể tạo một đối tượng kiểu từ điển bằng c&aacute;ch sử dụng h&agrave;m <code class="EnlighterJSRAW" data-enlighter-language="generic">dict()</code> đ&atilde; được t&iacute;ch hợp sẵn v&agrave; truyền v&agrave;o một dữ liệu dạng chuỗi của c&aacute;c cặp.</p> <p style="text-align: justify;">Ở tr&ecirc;n ta cũng c&oacute; thể thấy, ch&uacute;ng ta c&oacute; thể tạo ra một từ điển rỗng (c&acirc;u lệnh đầu ti&ecirc;n), c&oacute; thể sử dụng kh&oacute;a c&oacute; kiểu dữ liệu hỗn hợp (c&acirc;u lệnh 11) gồm kiểu chuỗi k&yacute; tự v&agrave; kiểu số nguy&ecirc;n. Ngo&agrave;i ra, gi&aacute; trị của một phần tử c&oacute; thể nhận cả kiểu dữ liệu danh s&aacute;ch. Y&ecirc;u cầu bất biến chỉ y&ecirc;u cầu với kh&oacute;a.</p> <p style="text-align: justify;">Kết quả đoạn m&atilde; tr&ecirc;n cho ta:</p> <pre class="language-markup"><code>{} {100: 'Hundred', 200: 'Two Hundred', 300: 'Three Hundred'} {'Ten': 'Nam', 'ID': [1, 3]} {100: 'Hundred', 200: 'Two Hundred'} {'Nam': 1, 'Trung': 2} {'name': 'Nam', 10: 'Mobile'}</code></pre> <p><strong>Cuối c&ugrave;ng ch&uacute;ng ta nhắc lại lưu &yacute; sau</strong>:</p> <ul> <li>C&aacute;c gi&aacute; trị (value) trong cặp key:value c&oacute; thể nhận bất cứ kiểu dữ liệu n&agrave;o, cũng c&oacute; thể tr&ugrave;ng nhau, nhưng</li> <li>Kh&oacute;a trong từ điển phải l&agrave; duy nhất v&agrave; phải thuộc kiểu dữ liệu bất biến như chuỗi k&yacute; tự, số, hay tuples.</li> </ul> <h2 style="text-align: justify;">Truy cập c&aacute;c phần tử</h2> <p>Như ở tr&ecirc;n đ&atilde; n&oacute;i, kiểu từ điển dictionary kh&ocirc;ng c&oacute; thứ tự nhưng lại c&oacute; chỉ số l&agrave; c&aacute;c kh&oacute;a. Do đ&oacute;, Ch&uacute;ng ta sẽ c&oacute; hai c&aacute;ch để truy cập một phần tử trong dictionary.</p> <ol> <li>Lấy gi&aacute; trị (value) của phần tử sử dụng kh&oacute;a (key) đặt trong cặp dấu ngoặc vu&ocirc;ng <code>[]</code></li> <li>Lấy gi&aacute; trị tương ứng với kh&oacute;a bằng c&aacute;ch truyền kh&oacute;a v&agrave;o như tham số của phương thức get <code>get()</code>.</li> </ol> <p style="text-align: justify;">Nếu ch&uacute;ng ta sử dụng dấu ngoặc vu&ocirc;ng, một lỗi KeyError sẽ xuất hiện trong trường hợp kh&ocirc;ng t&igrave;m thấy kh&oacute;a trong đối tượng kiểu từ điển. Ngược lại, phương thức get() sẽ trả về gi&aacute; trị None nếu kh&ocirc;ng t&igrave;m thấy kh&oacute;a chứ kh&ocirc;ng b&aacute;o lỗi.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>a = {100: 'Hundred', 200: 'Two Hundred', 300:"Three Hundred"} print(a[100]) print(a.get(200)) print(a.get(400)) print(a[400])</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Hundred Two Hundred None Traceback (most recent call last): File "e:/Learning/IT/Python/Bai2.py", line 5, in &lt;module&gt; print(a[400]) KeyError: 400</code></pre> <p>Như ch&uacute;ng ta thấy, ch&uacute;ng ta c&oacute; thể lấy được gi&aacute; trị Hundred v&agrave; Two Hundred từ c&aacute;c kh&oacute;a 100 v&agrave; 200 theo hai c&aacute;ch. C&aacute;c kh&oacute;a ở đ&acirc;y được sử dụng như c&aacute;c chỉ số để truy cập phần tử.</p> <p style="text-align: justify;"><span style="font-weight: 400;">Phương thức get() trả về gi&aacute; trị cho kh&oacute;a được chỉ định nếu kh&oacute;a nằm trong đối tượng kiểu từ điển.</span></p> <p style="text-align: justify;"><em><strong>C&uacute; ph&aacute;p:</strong></em></p> <pre class="language-markup"><code>dict.get(key[, value]) </code></pre> <p style="text-align: justify;"><span style="font-weight: 400;">Trong đ&oacute;:</span></p> <ol style="text-align: justify;"> <li><span style="font-weight: 400;">Tham số key l&agrave; kh&oacute;a cần được t&igrave;m kiếm trong từ điển.</span></li> <li><span style="font-weight: 400;">Tham số value l&agrave; t&ugrave;y chọn, l&agrave; gi&aacute; trị được trả về nếu kh&ocirc;ng t&igrave;m thấy kh&oacute;a. Gi&aacute; trị mặc định l&agrave; None.</span></li> </ol> <p style="text-align: justify;"><span style="font-weight: 400;">Phương thức n&agrave;y sẽ trả về:</span></p> <ol style="text-align: justify;"> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Gi&aacute; trị cho key được chỉ định nếu tồn tại trong từ điển.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">None nếu key kh&ocirc;ng được t&igrave;m thấy v&agrave; value kh&ocirc;ng được chỉ định.</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Value nếu key kh&ocirc;ng được t&igrave;m thấy v&agrave; value được chỉ định.</span></li> </ol> <p style="text-align: justify;"><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="language-python"><code>person = {'name': 'Phill', 'age': 22} print('Name: ', person.get('name')) print('Age: ', person.get('age')) print('Salary: ', person.get('salary')) print('Salary: ', person.get('salary', 0.0))</code></pre> <p style="text-align: justify;"><strong>Lưu &yacute;: Sự kh&aacute;c biệt giữa phương thức get() v&agrave; c&aacute;ch truy cập v&agrave;o phần tử bằng c&aacute;ch sử dụng kh&oacute;a dict[key] </strong>đ&oacute; l&agrave; p<span style="font-weight: 400;">hương thức get() sẽ trả về gi&aacute; trị mặc định nếu kh&oacute;a kh&ocirc;ng tồn tại trong đối tượng kiểu từ điển. Tuy nhi&ecirc;n, nếu kh&oacute;a kh&ocirc;ng được t&igrave;m thấy, việc sử dụng c&uacute; ph&aacute;p dict[key] sẽ đưa ra một ngoại lệ KeyError.</span></p> <h2><span style="font-weight: 400;">X&aacute;c định số phần tử của từ điển<strong><br /></strong></span></h2> <p><span style="font-weight: 400;">Để x&aacute;c định số phần tử c&oacute; trong đối tượng từ điển, ch&uacute;ng ta c&oacute; thể sử dụng h&agrave;m len(). Điều n&agrave;y giống với c&aacute;c kiểu dữ liệu dạng tập hợp kh&aacute;c như list, tuple hay set.<br /></span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="language-python" tabindex="0"><code>person = {"name": "Nam", "country": "Viet Nam", "telephone": 123456789} print(len(person))</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>3</code></pre> <h2 style="text-align: justify;">T&igrave;m gi&aacute; trị lớn nhất v&agrave; nhỏ nhất</h2> <p><span style="font-weight: 400;">H&agrave;m max() v&agrave; min() sẽ trả về c&aacute;c kh&oacute;a c&oacute; gi&aacute; trị lớn nhất v&agrave; nhỏ nhất tương ứng trong tập hợp từ điển.</span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>dict = {1:'aaa',2:'bbb',3:'AAA'} print('Maximum Key',max(dict)) print('Minimum Key',min(dict))</code></pre> <pre class="language-markup"><code>Maximum Key 3 Minimum Key 1</code></pre> <p><span style="font-weight: 400;">H&agrave;m max() v&agrave; min() sẽ xem x&eacute;t c&aacute;c kh&oacute;a để t&igrave;m c&aacute;c gi&aacute; trị lớn nhất v&agrave; nhỏ nhất tương ứng. H&agrave;m n&agrave;y kh&ocirc;ng xem x&eacute;t độ lớn của c&aacute;c gi&aacute; trị m&agrave; chỉ xem x&eacute;t kh&oacute;a!<br /></span></p> <p><span style="font-weight: 400;">Khi c&aacute;c kh&oacute;a c&oacute; kiểu dữ liệu hỗn hợp, v&iacute; dụ cả chuỗi k&yacute; tự v&agrave; số, th&igrave; chương tr&igrave;nh sẽ b&aacute;o lỗi:</span></p> <pre class="language-python"><code>dict = {1:'aaa',"2":'bbb',3:'AAA'} print('Maximum Key',max(dict)) print('Minimum Key',min(dict))</code></pre> <p>cho kết quả:</p> <pre class="language-markup"><code>TypeError: '&gt;' not supported between instances of 'str' and 'int'</code></pre> <h2><span style="font-weight: 400;"> <strong>H&agrave;m all()</strong></span></h2> <p style="text-align: justify;"><span style="font-weight: 400;">Khi h&agrave;m all() được sử dụng với tập hợp từ điển, gi&aacute; trị trả về sẽ l&agrave; true trong trường hợp tất cả c&aacute;c kh&oacute;a l&agrave; True v&agrave; False trong trường hợp ngược lại.</span></p> <p><span style="font-weight: 400;">Một số điều cần lưu &yacute; ở đ&acirc;y l&agrave;:</span></p> <ul> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Chỉ c&aacute;c gi&aacute; trị kh&oacute;a phải l&agrave; True</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">C&aacute;c gi&aacute; trị kh&oacute;a c&oacute; thể l&agrave; True hoặc 1 hoặc '0'</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">0 v&agrave; False trong kh&oacute;a sẽ trả về False</span></li> <li style="font-weight: 400;" aria-level="1"><span style="font-weight: 400;">Từ điển rỗng sẽ trả về gi&aacute; trị l&agrave; True.</span></li> </ul> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>dict1 = {1:'True',1:'False'} dict2 = {0:'True',1:'False'} dict3= {} dict4 = {'0':False} print(all(dict1)) print(all(dict2)) print(all(dict3)) print(all(dict4))</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>True False True True</code></pre> <h2><span style="font-weight: 400;"><strong> H&agrave;m any()</strong></span></h2> <p><span style="font-weight: 400;">H&agrave;m any() hoạt động tương tự như h&agrave;m any trong kiểu list, tuple v&agrave; set. Tuy nhi&ecirc;n kh&aacute;c biệt duy nhất đ&oacute; l&agrave; h&agrave;m n&agrave;y xem x&eacute;t c&aacute;c gi&aacute; trị của kh&oacute;a trong tử điển.<br /></span></p> <p><span style="font-weight: 400;">V&iacute; dụ:</span></p> <pre class="line-numbers language-python" tabindex="0"><code>dict1 = {1:'True',1:'False'} dict2 = {0:'True',1:'False'} dict3= {} dict4 = {'0':False} dict5 = {0:False} print(any(dict1)) print(any(dict2)) print(any(dict3)) print(any(dict4)) print(any(dict5))</code></pre> <p>Kết quả:</p> <pre class="language-markup"><code>True True False True False</code></pre> <p style="text-align: justify;">Như vậy, trong b&agrave;i n&agrave;y ch&uacute;ng ta đ&atilde; nắm được cơ bản về kiểu dữ liệu từ điển, v&agrave; một số thao t&aacute;c cơ bản tr&ecirc;n kiểu dữ liệu n&agrave;y. Trong b&agrave;i tiếp theo ch&uacute;ng ta sẽ c&ugrave;ng tiếp tục t&igrave;m hiểu một số thao t&aacute;c đặc biệt kh&aacute;c tr&ecirc;n kiểu dữ liệu n&agrave;y bao gồm c&aacute;c thao t&aacute;c tr&ecirc;n kh&oacute;a v&agrave; gi&aacute; trị của c&aacute;c phần tử trong từ điển.</p>