Định nghĩa từ điển

Kiểu dictionary biểu diễn một ánh xạ quan hệ giữa một khóa và một giá trị. Mỗi dictionary sẽ bao gồm danh sách của các cặp khóa và giá trị. Mỗi khóa được liên kết với một giá trị cụ thể và chúng ta có thể truy xuất giá trị cụ thể này dựa trên khóa của nó.

Các tính chất của kiểu dữ liệu từ điển trong Python:

  • Không có thứ tự: Các phần tử trong từ điển được lưu trữ dưới dạng key-value và chúng không có thứ tự hay không được đánh chỉ số lần lượt từ 0 đến n. Tính chất này giống tính chất của kiểu dữ liệu tập hợp set.

  • Tính duy nhất: Như đã nói ở trên, mỗi giá trị sẽ tương ứng với một khóa và khóa này phải là duy nhất để tránh nhầm lẫn khi truy cập các giá trị. Nếu chúng ta cố tình lưu một giá trị với 1 khóa đã có trước đó, thì giá trị gần nhất của dữ liệu sẽ được thay thế vào giá trị cũ.

  • Có thể thay đổi được: Kiểu từ điển có thể thay đổi được giá trị trong nó cũng như cho phép thêm và xóa các phần tử một cách dễ dàng.

a = {}
print(a)
## {}
a = {100: 'Hundred', 200: 'Two Hundred', 300: 'Three Hundred'}
print(a)
## {100: 'Hundred', 200: 'Two Hundred', 300: 'Three Hundred'}
a = {'Ten': 'Nam', 'ID': [1, 3]}
print(a)
## {'Ten': 'Nam', 'ID': [1, 3]}
a = dict({100: 'Hundred', 200: 'Two Hundred'})
print(a)
## {100: 'Hundred', 200: 'Two Hundred'}

Lưu ý:

  • Các giá trị (value) trong cặp key:value có thể nhận bất cứ kiểu dữ liệu nào, cũng có thể trùng nhau, nhưng

  • Khóa trong từ điển phải là duy nhất và phải thuộc kiểu dữ liệu bất biến như chuỗi ký tự, số, hay tuples.

Truy cập các phần tử của từ điển

Như ở trên đã nói, kiểu từ điển dictionary không có thứ tự nhưng lại có chỉ số là các khóa. Do đó, Chúng ta sẽ có hai cách để truy cập một phần tử trong dictionary:

  1. Lấy giá trị (value) của phần tử sử dụng khóa (key) đặt trong cặp dấu ngoặc vuông []

  2. Lấy giá trị tương ứng với khóa bằng cách truyền khóa vào như tham số của phương thức get get().

Nếu chúng ta sử dụng dấu ngoặc vuông, một lỗi KeyError sẽ xuất hiện trong trường hợp không tìm thấy khóa trong đối tượng kiểu từ điển. Ngược lại, phương thức get() sẽ trả về giá trị None nếu không tìm thấy khóa chứ không báo lỗi.

a = {100: 'Hundred', 200: 'Two Hundred', 300:"Three Hundred"}
print(a[100])
## Hundred
print(a.get(200))
## Two Hundred
print(a.get(400))
## None
person = {'name': 'Phill', 'age': 22}
print('Name: ', person.get('name'))
## Name:  Phill
print('Age: ', person.get('age'))
## Age:  22
print('Salary: ', person.get('salary'))
## Salary:  None
print('Salary: ', person.get('salary', 0.0))
## Salary:  0.0

Xác định số phần tử của từ điển

Để xác định số phần tử có trong đối tượng từ điển, chúng ta có thể sử dụng hàm len(). Điều này giống với các kiểu dữ liệu dạng tập hợp khác như list, tuple hay set.

person = {"name": "Nam", "country": "Viet Nam", "telephone": 123456789}
print(len(person))
## 3

Tìm giá trị lớn nhất và nhỏ nhất

Hàm max()min() sẽ trả về các khóa có giá trị lớn nhất và nhỏ nhất tương ứng trong tập hợp từ điển.

dict = {1:'aaa',2:'bbb',3:'AAA', 4:'CC'}
print('Maximum Key',max(dict))
## Maximum Key 4
print('Minimum Key',min(dict))
## Minimum Key 1

Hàm max() và min() không xem xét độ lớn của các giá trị mà chỉ xem xét khóa!

Khi các khóa có kiểu dữ liệu hỗn hợp, ví dụ cả chuỗi ký tự và số, thì chương trình sẽ báo lỗi:

#dict = {1:'aaa',"2":'bbb',3:'AAA'}
#print('Maximum Key',max(dict))
#print('Minimum Key',min(dict))

Hàm all()

Khi hàm all() được sử dụng với tập hợp từ điển, giá trị trả về sẽ là True trong trường hợp tất cả các khóa là TrueFalse trong trường hợp ngược lại.

Một số điều cần lưu ý ở đây là:

  • Chỉ các giá trị khóa phải là True

  • Các giá trị khóa có thể là True hoặc 1 hoặc ‘0

  • 0False trong khóa sẽ trả về False

  • Từ điển rỗng sẽ trả về giá trị là True.

dict1 = {1:'True',1:'False'}
dict2 = {0:'True',1:'False'}
dict3= {}
dict4 = {'0':False}

print(all(dict1))
## True
print(all(dict2))
## False
print(all(dict3))
## True
print(all(dict4))
## True

Hàm any()

Hàm any() hoạt động tương tự như hàm any() trong kiểu list, tuple và set. Tuy nhiên khác biệt duy nhất đó là hàm này xem xét các giá trị của khóa trong tử điển.

dict1 = {1:'True',1:'False'}
dict2 = {0:'True',1:'False'}
dict3= {}
dict4 = {'0':False}
dict5 = {0:False}

print(any(dict1))
## True
print(any(dict2))
## True
print(any(dict3))
## False
print(any(dict4))
## True
print(any(dict5))
## False

Thay đối giá trị phần tử của Dictionary Python

Chúng ta có hai thao tác chủ yếu đó là thêm hoặc thay đổi giá trị cho một phần tử, và đương nhiên để thay đổi thì ta phải biết tên key.

my_dict = {'name':'Jack', 'age': 26}
my_dict['age'] = 27
print(my_dict)
## {'name': 'Jack', 'age': 27}
my_dict['address'] = 'Downtown' 
print(my_dict)
## {'name': 'Jack', 'age': 27, 'address': 'Downtown'}

Xóa phần tử ra khỏi Dictionary

Chúng ta có thể xóa một phần tử ra khỏi dictionary bằng cách sử dụng phương thức pop(), tham số truyền vào là tên key cần xóa, kết quả trả về là giá trị của phần tử đã xóa.

Hoặc sử dụng phương thức popitem() để xóa phần tử ra khỏi dictionary và kết quả trả về là cặp giá trị (key, value) đã xóa, và sử dụng phương thức clear() để xóa toàn bộ phần tử.

squares = {1:1, 2:4, 3:9, 4:16, 5:25}
print(squares.pop(4))  
## 16
print(squares)
## {1: 1, 2: 4, 3: 9, 5: 25}
print(squares.popitem())
## (5, 25)
print(squares)
## {1: 1, 2: 4, 3: 9}
del squares[1]
# Xóa biến squares ra khỏi bộ nhớ
del squares

Vòng lặp for và từ điển

squares = {1:1, 2:4, 3:9, 4:16, 5:25} 
squares[1] = squares[1]*2
squares[2] = squares[2]*2
squares[3] = squares[3]*2
squares[4] = squares[4]*2

#Output: {1: 2, 2: 8, 3: 18, 4: 32, 5: 25}
print(squares)
## {1: 2, 2: 8, 3: 18, 4: 32, 5: 25}
a_dict = {'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
for key in a_dict:
  print(key)
## color
## fruit
## pet
a_dict = {'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
for key in a_dict:
  print(key, '->', a_dict[key])
## color -> blue
## fruit -> apple
## pet -> dog
a_dict = {'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
d_items = a_dict.items()
d_items  # Here d_items is a view of items
## dict_items([('color', 'blue'), ('fruit', 'apple'), ('pet', 'dog')])
for item in a_dict.items():
  print(item)
## ('color', 'blue')
## ('fruit', 'apple')
## ('pet', 'dog')
for key, value in a_dict.items():
  print(key, '->', value)
## color -> blue
## fruit -> apple
## pet -> dog
for key in a_dict.keys():
  print(key)
## color
## fruit
## pet
for key in a_dict.keys():
  print(key, '->', a_dict[key])
## color -> blue
## fruit -> apple
## pet -> dog
for value in a_dict.values():
  print(value)
## blue
## apple
## dog
#a_dict = {'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
  #'pet' in a_dict.keys()
prices = {'apple': 0.40, 'orange': 0.35, 'banana': 0.25}
for key in list(prices.keys()):  # Use a list instead of a view
  if key == 'orange':
    del prices[key]  # Delete a key from prices
print(prices)
## {'apple': 0.4, 'banana': 0.25}

Bài tập ôn tập:

  1. Cho trước tập hợp A là một tập hợp bao gồm các số nguyên, số thực và xâu ký tự. Hãy viết chương trình đếm số phần tử là số nguyên, số thập phân và xâu ký tự của tập hợp A.

  2. Hãy viết chương trình thực hiện các nội dung sau:

• Viết chương trình nhập vào một số nguyên dương n.

• Hãy tạo ra hai tập hợp A và B thỏa mãn điều kiện: Tập A là tập hợp gồm các số nguyên tố và đồng thời là ước số của n; B là tập hợp gồm các số nguyên tố nhỏ hơn n và không phải ước số của n.
  1. Giả sử chúng ta tạo ra một từ điển có tên là mydict, với mydict là các phần tử mà có key là \(i\) và values của key là \(i*i\). Hãy viết chương trình nhập vào một số nguyên N in ra từ điển có dạng trên:
Nhập $N = 5$

mydict ={1:1, 2:4, 3:9: 4:16, 5:25)
  1. Cho hai danh sách khác nhau gồm n phần tử nhập vào từ bàn phím. \(a_{0},a_{1},...,a_{n-1}\)và danh sách thứ hai bao gồm \(b_{0},b_{1},...,b_{n-1}\) Tạo ra một từ điển mydict mà key của mydict là các giá trị trong véc tơ a, còn value của mydict là giá trị trong véc tơ b.

  2. Thống kê điểm thi: Hãy viết chương trình trong Python sử dụng kiến thức về từ điển nhập thông tin của học sinh, bao gồm: Điểm, tên của học sinh và lưu thông tin này trong một từ điển gọi là myclass.

    • Điểm sẽ thuộc trong tập hợp 0,1,2,…,10.

    • Tên là một chuỗi ký tự nhập vào

    Yêu cầu: Thống kê số học sinh được điểm 10, điểm 9, điểm 8.…

  3. Sử dụng từ điển làm bài tập sau:

    Nhập vào một nội dung một chuỗi ký tự bao gồm ký tự số và ký tự chữ. Đếm số chữ cái và chữ số trong chuỗi đó.

    Input: Python@123

    Output:

    • Số ký tự chữ: 6

    • Số ký tự là số: 3

  4. Đọc, dịch sang tiếng Việt và làm lại bài tập sau theo hướng dẫn:

    https://erlerobotics.gitbooks.io/erle-robotics-learning-python-gitbook-free/content/lists/exercises_list_and_dictionaries.html