Bài 6.2. Python - Làm việc với từ điển

Bài 6.2. Python - Làm việc với từ điển
Từ điển trong Python là một tập hợp các cặp khóa-giá trị. Mỗi khóa được kết nối với một giá trị, và bạn có thể sử dụng khóa để truy cập giá trị tương ứng với khóa đó. Giá trị của một khóa có thể là một số, một chuỗi, một danh sách, hoặc thậm chí là một từ điển khác. Thực tế, bạn có thể sử dụng bất kỳ đối tượng nào mà bạn có thể tạo trong Python làm giá trị trong một từ điển.
Trong Python, một từ điển được bao bọc trong dấu ngoặc nhọn {}
với một loạt các cặp khóa-giá trị bên trong dấu ngoặc nhọn, như được hiển thị trong ví dụ trước:
alien_0 = {'color': 'green', 'points': 5}
Một cặp khóa-giá trị là một tập hợp các giá trị được kết nối với nhau. Khi bạn cung cấp một khóa, Python trả về giá trị tương ứng với khóa đó. Mỗi khóa được kết nối với giá trị của nó bằng dấu hai chấm, và các cặp khóa-giá trị riêng lẻ được phân tách bằng dấu phẩy. Bạn có thể lưu trữ bao nhiêu cặp khóa-giá trị tùy thích trong một từ điển.
Truy cập giá trị trong từ điển
Để lấy giá trị tương ứng với một khóa, hãy đưa tên của từ điển và sau đó đặt khóa bên trong một tập hợp dấu ngoặc vuông, như được hiển thị ở đây:
alien_0 = {'color': 'green'}
print(alien_0['color'])
Điều này trả về giá trị tương ứng với khóa 'color' từ từ điển alien_0
:
green
Bạn có thể có một số lượng không giới hạn các cặp khóa-giá trị trong một từ điển. Ví dụ, đây là từ điển alien_0
ban đầu với hai cặp khóa-giá trị:
alien_0 = {'color': 'green', 'points': 5}
Bây giờ bạn có thể truy cập màu sắc hoặc giá trị điểm của alien_0
. Nếu một người chơi bắn hạ người ngoài hành tinh này, bạn có thể tra cứu xem họ nên kiếm được bao nhiêu điểm bằng cách sử dụng mã như sau:
alien_0 = {'color': 'green', 'points': 5}
new_points = alien_0['points']
print(f"You just earned {new_points} points!")
Khi từ điển đã được định nghĩa, chúng ta lấy giá trị tương ứng với khóa 'points' từ từ điển. Giá trị này sau đó được gán cho biến new_points
. Dòng cuối cùng in ra một câu thông báo về số điểm mà người chơi vừa kiếm được:
You just earned 5 points!
Nếu bạn chạy mã này mỗi khi một người ngoài hành tinh bị bắn hạ, giá trị điểm của người ngoài hành tinh sẽ được truy xuất.
Thêm cặp khóa-giá trị mới
Từ điển là các cấu trúc động, và bạn có thể thêm các cặp khóa-giá trị mới vào một từ điển bất cứ lúc nào. Để thêm một cặp khóa-giá trị mới, bạn sẽ đưa tên của từ điển theo sau là khóa mới trong dấu ngoặc vuông, cùng với giá trị mới.
Hãy thêm hai mẩu thông tin mới vào từ điển alien_0
: tọa độ x và y của người ngoài hành tinh, điều này sẽ giúp chúng ta hiển thị người ngoài hành tinh ở một vị trí cụ thể trên màn hình. Hãy đặt người ngoài hành tinh ở cạnh trái của màn hình, cách 25 pixel từ trên xuống. Vì tọa độ màn hình thường bắt đầu từ góc trên bên trái của màn hình, chúng ta sẽ đặt người ngoài hành tinh ở cạnh trái của màn hình bằng cách đặt tọa độ x là 0 và cách 25 pixel từ trên xuống bằng cách đặt tọa độ y là 25, như được hiển thị ở đây:
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
Chúng ta bắt đầu bằng cách định nghĩa cùng một từ điển mà chúng ta đã làm việc với. Sau đó, chúng ta in ra từ điển này, hiển thị một ảnh chụp nhanh thông tin của nó. Tiếp theo, chúng ta thêm một cặp khóa-giá trị mới vào từ điển: khóa 'x_position' và giá trị 0. Chúng ta làm tương tự cho khóa 'y_position'. Khi chúng ta in ra từ điển đã được sửa đổi, chúng ta thấy hai cặp khóa-giá trị bổ sung:
{'color': 'green', 'points': 5}
{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 25}
Phiên bản cuối cùng của từ điển chứa bốn cặp khóa-giá trị. Hai cặp ban đầu chỉ định màu sắc và giá trị điểm, và hai cặp khác chỉ định vị trí của người ngoài hành tinh.
Từ điển giữ nguyên thứ tự mà chúng được định nghĩa. Khi bạn in ra một từ điển hoặc lặp qua các phần tử của nó, bạn sẽ thấy các phần tử theo thứ tự mà chúng được thêm vào từ điển.
Bắt đầu với một từ điển trống
Đôi khi thuận tiện, hoặc thậm chí cần thiết, để bắt đầu với một từ điển trống và sau đó thêm từng mục mới vào đó. Để bắt đầu điền vào một từ điển trống, hãy định nghĩa một từ điển với một tập hợp dấu ngoặc nhọn trống và sau đó thêm từng cặp khóa-giá trị trên từng dòng riêng biệt. Ví dụ, đây là cách xây dựng từ điển alien_0
bằng cách sử dụng phương pháp này:
alien_0 = {}
alien_0['color'] = 'green'
alien_0['points'] = 5
print(alien_0)
Chúng ta đầu tiên định nghĩa một từ điển trống alien_0
, và sau đó thêm các giá trị màu sắc và điểm vào đó. Kết quả là từ điển mà chúng ta đã sử dụng trong các ví dụ trước:
{'color': 'green', 'points': 5}
Thông thường, bạn sẽ sử dụng các từ điển trống khi lưu trữ dữ liệu do người dùng cung cấp trong một từ điển hoặc khi viết mã tạo ra một số lượng lớn các cặp khóa-giá trị tự động.
Sửa đổi giá trị trong từ điển
Để sửa đổi một giá trị trong từ điển, hãy đưa tên của từ điển với khóa trong dấu ngoặc vuông và sau đó là giá trị mới mà bạn muốn liên kết với khóa đó. Ví dụ, hãy xem xét một người ngoài hành tinh thay đổi từ màu xanh lá cây sang màu vàng khi trò chơi tiến triển:
alien_0 = {'color': 'green'}
print(f"The alien is {alien_0['color']}.")
alien_0['color'] = 'yellow'
print(f"The alien is now {alien_0['color']}.")
Chúng ta đầu tiên định nghĩa một từ điển cho alien_0
chỉ chứa màu sắc của người ngoài hành tinh; sau đó chúng ta thay đổi giá trị liên kết với khóa 'color' thành 'yellow'. Đầu ra cho thấy rằng người ngoài hành tinh đã thực sự thay đổi từ màu xanh lá cây sang màu vàng:
The alien is green.
The alien is now yellow.
Để có một ví dụ thú vị hơn, hãy theo dõi vị trí của một người ngoài hành tinh có thể di chuyển với các tốc độ khác nhau. Chúng ta sẽ lưu trữ một giá trị đại diện cho tốc độ hiện tại của người ngoài hành tinh và sau đó sử dụng nó để xác định người ngoài hành tinh nên di chuyển bao xa sang phải:
alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}
print(f"Original position: {alien_0['x_position']}")
# Di chuyển người ngoài hành tinh sang phải.
# Xác định khoảng cách di chuyển của người ngoài hành tinh dựa trên tốc độ hiện tại của nó.
if alien_0['speed'] == 'slow':
x_increment = 1
elif alien_0['speed'] == 'medium':
x_increment = 2
else:
# Đây phải là một người ngoài hành tinh nhanh.
x_increment = 3
# Vị trí mới là vị trí cũ cộng với khoảng cách di chuyển.
alien_0['x_position'] = alien_0['x_position'] + x_increment
print(f"New position: {alien_0['x_position']}")
Chúng ta bắt đầu bằng cách định nghĩa một người ngoài hành tinh với vị trí x ban đầu và vị trí y, và tốc độ là 'medium'. Chúng ta đã bỏ qua các giá trị màu sắc và điểm để đơn giản hóa, nhưng ví dụ này sẽ hoạt động tương tự nếu bạn bao gồm các cặp khóa-giá trị đó. Chúng ta cũng in ra giá trị ban đầu của x_position
để xem người ngoài hành tinh di chuyển bao xa sang phải.
Một chuỗi if-elif-else xác định người ngoài hành tinh nên di chuyển bao xa sang phải, và gán giá trị này cho biến x_increment
. Nếu tốc độ của người ngoài hành tinh là 'slow', nó di chuyển một đơn vị sang phải; nếu tốc độ là 'medium', nó di chuyển hai đơn vị sang phải; và nếu nó là 'fast', nó di chuyển ba đơn vị sang phải. Khi khoảng cách di chuyển đã được tính toán, nó được thêm vào giá trị của x_position
, và kết quả được lưu trữ trong x_position
của từ điển.
Vì đây là một người ngoài hành tinh có tốc độ trung bình, vị trí của nó dịch chuyển hai đơn vị sang phải:
Original x-position: 0
New x-position: 2
Kỹ thuật này khá thú vị: bằng cách thay đổi một giá trị trong từ điển của người ngoài hành tinh, bạn có thể thay đổi hành vi tổng thể của người ngoài hành tinh. Ví dụ, để biến người ngoài hành tinh có tốc độ trung bình này thành một người ngoài hành tinh nhanh, bạn sẽ thêm dòng này:
alien_0['speed'] = 'fast'
Khối if-elif-else sau đó sẽ gán một giá trị lớn hơn cho x_increment
lần tiếp theo mã chạy.
Xóa cặp khóa-giá trị
Khi bạn không còn cần một mẩu thông tin nào đó được lưu trữ trong một từ điển, bạn có thể sử dụng câu lệnh del
để hoàn toàn xóa một cặp khóa-giá trị. Tất cả những gì del
cần là tên của từ điển và khóa mà bạn muốn xóa.
Ví dụ, hãy xóa khóa 'points' khỏi từ điển alien_0
, cùng với giá trị của nó:
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
del alien_0['points']
print(alien_0)
Câu lệnh del
yêu cầu Python xóa khóa 'points' khỏi từ điển alien_0
và xóa giá trị liên kết với khóa đó. Đầu ra cho thấy rằng khóa 'points' và giá trị của nó là 5 đã bị xóa khỏi từ điển, nhưng phần còn lại của từ điển không bị ảnh hưởng:
{'color': 'green', 'points': 5}
{'color': 'green'}
Từ điển của các đối tượng tương tự
Ví dụ trước liên quan đến việc lưu trữ các loại thông tin khác nhau về một đối tượng, một người ngoài hành tinh trong một trò chơi. Bạn cũng có thể sử dụng một từ điển để lưu trữ một loại thông tin về nhiều đối tượng. Ví dụ, giả sử bạn muốn thăm dò một số người và hỏi họ ngôn ngữ lập trình yêu thích của họ là gì. Một từ điển hữu ích để lưu trữ kết quả của một cuộc thăm dò đơn giản như thế này:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
Như bạn có thể thấy, chúng ta đã chia một từ điển lớn thành nhiều dòng. Mỗi khóa là tên của một người đã trả lời cuộc thăm dò, và mỗi giá trị là lựa chọn ngôn ngữ của họ. Khi bạn biết rằng bạn sẽ cần nhiều hơn một dòng để định nghĩa một từ điển, hãy nhấn ENTER sau dấu ngoặc nhọn mở. Sau đó thụt lề dòng tiếp theo một mức (bốn khoảng trắng) và viết cặp khóa-giá trị đầu tiên, theo sau là dấu phẩy. Từ điểm này trở đi, khi bạn nhấn ENTER, trình soạn thảo văn bản của bạn sẽ tự động thụt lề tất cả các cặp khóa-giá trị tiếp theo để khớp với cặp khóa-giá trị đầu tiên.
Khi bạn đã hoàn thành việc định nghĩa từ điển, hãy thêm một dấu ngoặc nhọn đóng trên một dòng mới sau cặp khóa-giá trị cuối cùng, và thụt lề nó một mức để nó căn chỉnh với các khóa trong từ điển. Thực hành tốt là bao gồm một dấu phẩy sau cặp khóa-giá trị cuối cùng, để bạn sẵn sàng thêm một cặp khóa-giá trị mới trên dòng tiếp theo.
Để sử dụng từ điển này, với tên của một người đã tham gia cuộc thăm dò, bạn có thể dễ dàng tra cứu ngôn ngữ yêu thích của họ:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
language = favorite_languages['sarah'].title()
print(f"Sarah's favorite language is {language}.")
Để xem ngôn ngữ mà Sarah đã chọn, chúng ta yêu cầu giá trị tại:
favorite_languages['sarah']
Chúng ta sử dụng cú pháp này để lấy ngôn ngữ yêu thích của Sarah từ từ điển và gán nó cho biến language
. Tạo một biến mới ở đây làm cho lệnh print()
sạch hơn nhiều. Đầu ra cho thấy ngôn ngữ yêu thích của Sarah:
Sarah's favorite language is C.
Bạn có thể sử dụng cùng cú pháp này với bất kỳ cá nhân nào được đại diện trong từ điển.
Sử dụng phương thức get() để truy cập giá trị
Sử dụng các khóa trong dấu ngoặc vuông để truy xuất giá trị mà bạn quan tâm từ một từ điển có thể gây ra một vấn đề tiềm ẩn: nếu khóa bạn yêu cầu không tồn tại, bạn sẽ gặp lỗi.
Hãy xem điều gì xảy ra khi bạn yêu cầu giá trị điểm của một người ngoài hành tinh không có giá trị điểm được đặt:
alien_0 = {'color': 'green', 'speed': 'slow'}
print(alien_0['points'])
Điều này dẫn đến một traceback, hiển thị một lỗi KeyError:
Traceback (most recent call last):
File "alien_no_points.py", line 2, in <module>
print(alien_0['points'])
KeyError: 'points'
Bạn sẽ học thêm về cách xử lý các lỗi như thế này nói chung trong Chương 10. Đối với các từ điển cụ thể, bạn có thể sử dụng phương thức get()
để đặt một giá trị mặc định sẽ được trả về nếu khóa được yêu cầu không tồn tại.
Phương thức get()
yêu cầu một khóa làm đối số đầu tiên. Là một đối số tùy chọn thứ hai, bạn có thể truyền giá trị sẽ được trả về nếu khóa không tồn tại:
alien_0 = {'color': 'green', 'speed': 'slow'}
point_value = alien_0.get('points', 'No point value assigned.')
print(point_value)
Nếu khóa 'points' tồn tại trong từ điển, bạn sẽ nhận được giá trị tương ứng. Nếu không, bạn sẽ nhận được giá trị mặc định. Trong trường hợp này, 'points' không tồn tại, và chúng ta nhận được một thông báo sạch sẽ thay vì một lỗi:
No point value assigned.
Nếu có khả năng khóa bạn yêu cầu có thể không tồn tại, hãy xem xét sử dụng phương thức get()
thay vì cú pháp dấu ngoặc vuông.
Comments