Python – Kiểu Dictionary

4.8/5 - (20 votes)

Trong phần này chúng ta sẽ tìm hiểu sâu hơn về kiểu dữ liệu Dictionary.

Kiểu dictionary là kiểu dữ liệu danh sách, trong đó các phần tử được lưu trữ theo các cặp khóa-giá trị (key-value). Các phần tử trong dictionary không có thứ tự, tức là bạn không thể truy xuất chúng qua chỉ số mà chỉ dùng khóa, ngoài ra vì không có thứ tự nên Python cũng không có sẵn các hàm sắp xếp như hàm sort(), tuy nhiên nếu muốn bạn vẫn có thể tự code lấy hàm sort cho riêng mình. Trong các ngôn ngữ khác thì kiểu dictionary hay được gọi là bảng băm. Trong dictionary không có 2 khóa trùng nhau.

Khởi tạo dictionary

Đầu tiên chúng ta sẽ tìm hiểu cách khởi tạo một dictionary.


weekend = { "Sun": "Sunday", "Mon": "Monday" }
vals = dict(one=1, two=2)

capitals = {}
capitals["svk"] = "Bratislava"
capitals["deu"] = "Berlin"
capitals["dnk"] = "Copenhagen"

d = { i: object() for i in range(4) }

print (weekend)
print (vals)
print (capitals)
print (d)

Đoạn code trên ví dụ về 4 cách để khởi tạo 1 dictionary trong Python.

weekend = { "Sun": "Sunday", "Mon": "Monday" }

Cách đầu tiên và cũng là cách đơn giản nhất. Chúng ta tạo dictionary bằng cách gán dữ liệu trực tiếp. Dictionary được bao bọc bởi cặp dấu ngoặc nhọn {}. Trong đó mỗi phần tử được gán giá trị theo cú pháp key1:value1, key2:value2…, các phần tử phân cách nhau bởi dấu phẩy.

vals = dict(one=1, two=2)

Cách thứ 2 là chúng ta dùng hàm dict().

capitals = {}
capitals["svk"] = "Bratislava"
capitals["deu"] = "Berlin"
capitals["dnk"] = "Copenhagen"

Trên đây là cách thứ 3, đầu tiên chúng ta khởi tạo dict rỗng bằng cặp dấu {}. Sau đó khởi tạo các khóa và gán giá trị, các khóa được tạo trong cặp dấu ngoặc vuông [].

d = { i: object() for i in range(4) }

Cũng giống như kiểu list, dictionary cũng có thể được khởi tạo theo cú pháp comprehension. Cú pháp này có 2 phần, phần đầu tiên là phần biểu thức i: object(), phần thứ 2 là vòng lặp for i in range(4). Tức là cứ mỗi lần lặp, giá trị từ biểu thức sẽ được thêm vào dictionary. Hàm object() khởi tạo một đối tượng kiểu object. Đối tượng này không có giá trị, do đó khi in ra màn hình python sẽ in thông tin về địa chỉ bộ nhớ.

{'Sun': 'Sunday', 'Mon': 'Monday'}
{'two': 2, 'one': 1}
{'svk': 'Bratislava', 'dnk': 'Copenhagen', 'deu': 'Berlin'}
{0: <object object at 0xb76cb4a8>, 1: <object object at 0xb76cb4b0>, 
2: <object object at 0xb76cb4b8>, 3: <object object at 0xb76cb4c0>}

Các phép toán cơ bản

Tiếp theo chúng ta sẽ tìm hiểu về các phép toán cơ bản với dictionary.


basket = { 'oranges': 12, 'pears': 5, 'apples': 4 }

basket['bananas'] = 5

print (basket)
print ("There are %d various items in the basket" % len(basket))

print (basket['apples'])
basket['apples'] = 8
print (basket['apples'])

print (basket.get('oranges', 'undefined'))
print (basket.get('cherries', 'undefined'))

Trong ví dụ trên chúng ta có một dictionary và chúng ta sẽ thực hiện một số phép toán với dict này.

basket = { 'oranges': 12, 'pears': 5, 'apples': 4 }

Đầu tiên chúng ta tạo dict với 3 cặp khóa-giá trị.

basket['bananas'] = 5

Tiếp theo chúng ta tạo thêm 1 cặp khóa-giá trị nữa. Ở đây khóa là bananas còn giá trị là 5.

print ("There are %d various items in the basket" % len(basket))

Chúng ta dùng hàm len() để đếm số lượng các cặp khóa-giá trị.

print (basket['apples'])

Tiếp theo chúng ta in ra màn hình giá trị của khóa apples.

basket['apples'] = 8

Dòng trên thay đổi giá trị của khóa apples thành 8.

print (basket.get('oranges', 'undefined'))

Phương thức get() trả về giá trị của khóa oranges, nếu không có khóa nào có tên như thế thì trả về dòng chữ undefined.

print (basket.get('cherries', 'undefined'))

Dòng trên sẽ trả về undefined vì không có khóa nào tên là cherries.

{'bananas': 5, 'pears': 5, 'oranges': 12, 'apples': 4}
There are 4 various items in the basket
4
8
12
undefined

Tiếp theo chúng ta tìm hiểu về 2 phương thức fromkeys() và setdefault().


basket = ('oranges', 'pears', 'apples', 'bananas')

fruits = {}.fromkeys(basket, 0)
print (fruits)

fruits['oranges'] = 12
fruits['pears'] = 8
fruits['apples'] = 4

print (fruits.setdefault('oranges', 11))
print (fruits.setdefault('kiwis', 11))

print (fruits)

Phương thức fromkeys() tạo một dictionary từ một list, còn phương thức setdefault() trả về giá trị của một khóa, nếu khóa đó không tồn tại thì nó tự động thêm một khóa mới với giá trị mặc định do chúng ta chỉ định.

basket = ('oranges', 'pears', 'apples', 'bananas')

Đầu tiên chúng ta tạo một list các string.

fruits = {}.fromkeys(basket, 0)

Tiếp theo chúng ta dùng phương thức fromkeys() để tạo dictionary từ list trên, trong đó các khóa sẽ là các phần tử của list, còn các giá trị sẽ được gán mặc định là 0. Lưu ý phương thức fromkeys là phương thức của một lớp nên cần được gọi từ tên lớp, trong trường hợp này là {}.

fruits['oranges'] = 12
fruits['pears'] = 8
fruits['apples'] = 4

Ba dòng trên thay đổi giá trị của các khóa trong dict.

print (fruits.setdefault('oranges', 11))
print (fruits.setdefault('kiwis', 11))

Ở 2 dòng trên, dòng đầu tiên sẽ in số 12 ra màn hình vì oranges là khóa đã tồn tại trong dict, dòng thứ 2 sẽ in số 11 ra màn hình vì khóa kiwis chưa tồn tại nên sẽ được tự động thêm vào dict với giá trị mặc định là 11.

{'bananas': 0, 'pears': 0, 'oranges': 0, 'apples': 0}
12
11
{'kiwis': 11, 'bananas': 0, 'pears': 8, 'oranges': 12, 'apples': 4}

Trong ví dụ tiếp theo, chúng ta sẽ tìm hiểu cách nối 2 dictionary với nhau.


domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary"}
domains2 = { "us": "United States", "no": "Norway" }

domains.update(domains2)

print (domains)

Để nối 2 dictionary thì chúng ta dùng phương thức update().

domains.update(domains2)

Chúng ta nối domains2 vào domains.

{'sk': 'Slovakia', 'de': 'Germany', 'no': 'Norway', 
'us': 'United States', 'hu': 'Hungary'}

Tiếp theo chúng ta học cách xóa một phần tử ra khỏi dictionary.


items = { "coins": 7, "pens": 3, "cups": 2, 
    "bags": 1, "bottles": 4, "books": 5 }

print (items) 

items.pop("coins")
print (items)

del items["bottles"]
print (items)

items.clear()
print (items)

Trong ví dụ trên, chúng ta có 6 cặp khóa-giá trị, chúng ta sẽ xóa chúng ra khỏi items.

items.pop("coins")

Đầu tiên là phương thức pop(), phương thức này xóa một phần tử trong dictionary theo khóa.

del items["bottles"]

Cách thứ 2 là dùng từ khóa del, dòng code trên sẽ xóa phần tử có khóa bottles ra khỏi dict bằng từ khóa del.

items.clear()

Tiếp theo phương thức clear() có tác dụng xóa toàn bộ phần tử ra khỏi dictionary.

{'bags': 1, 'pens': 3, 'coins': 7, 'books': 5, 'bottles': 4, 'cups': 2}
{'bags': 1, 'pens': 3, 'books': 5, 'bottles': 4, 'cups': 2}
{'bags': 1, 'pens': 3, 'books': 5, 'cups': 2}
{}

Làm việc với khóa và giá trị

Trong phần này chúng ta sẽ tìm hiểu phương thức keys(), values() và items(), phương thức keys() trả về list các khóa có trong dict, phương thức values() trả về list các giá trị, còn phương thức items() trả về list các tuple, trong đó mỗi tuple có 2 phần tử, phần tử đầu tiên là khóa, phần tử thứ 2 là giá trị.

domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

print (domains.keys())
print (domains.values())
print (domains.items())

print ("de" in domains)
print ("cz" in domains)

Đoạn code trên ví dụ về cách sử dụng các phương thức đã trình bày ở trên, ngoài ra chúng ta còn dùng thêm từ khóa in.

print (domains.keys())

Dòng trên trả về một list các khóa trong dict bằng phương thức keys().

print (domains.values())

Dòng tiếp theo trả về một list các giá trị trong dict bằng phương thức values().

print (domains.items())

Cuối cùng phương thức items() trả về list các tuple, mỗi tuple chứa 2 phần tử là khóa và giá trị trong dict.

print ("de" in domains)
print ("cz" in domains)

Từ khóa in có tác dụng kiểm tra xem một giá trị nào đó có tồn tại trong dict hay không. Giá trị trả về True hoặc False.

['sk', 'de', 'no', 'us', 'hu']
['Slovakia', 'Germany', 'Norway', 'United States', 'Hungary']
[('sk', 'Slovakia'), ('de', 'Germany'), ('no', 'Norway'), 
('us', 'United States'), ('hu', 'Hungary')]
True
False

Duyệt dictionary

Trong phần này chúng ta sẽ tìm hiểu cách duyệt một dictionary bằng vòng lặp for.


domains = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

for key in domains:
    print (key)
    
for k in domains:
    print (domains[k])
    
for k, v in domains.items():
    print (": ".join((k, v)))

Trong ví dụ trên, chúng ta duyệt 3 lần, mỗi lần duyệt chúng ta lấy khóa, giá trị và cả khóa lẫn giá trị.

for key in domains:
    print (key)

Vòng lặp trên sẽ in ra danh sách các khóa trong dict.

for k in domains:
    print (domains[k])

Vòng lặp trên in ra danh sách cấc giá trị trong list.

for k, v in domains.items():
    print (": ".join((k, v)))

Vòng lặp cuối cùng in ra cả khóa và giá trị.

sk
de
no
us
hu
Slovakia
Germany
Norway
United States
Hungary
sk: Slovakia
de: Germany
no: Norway
us: United States
hu: Hungary
5 1 vote
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Comment
Inline Feedbacks
View all comments
hoàng
hoàng
6 năm trước

Cám ơn tác giả ạ