Bài 6.3. Python - Lặp qua từ điển

Bài 6.3. Python - Lặp qua từ điển
Một từ điển Python đơn lẻ có thể chứa chỉ vài cặp khóa-giá trị hoặc hàng triệu cặp. Vì một từ điển có thể chứa lượng dữ liệu lớn, Python cho phép bạn lặp qua một từ điển. Từ điển có thể được sử dụng để lưu trữ thông tin theo nhiều cách khác nhau; do đó, có nhiều cách khác nhau để lặp qua chúng. Bạn có thể lặp qua tất cả các cặp khóa-giá trị của một từ điển, qua các khóa của nó, hoặc qua các giá trị của nó.
Lặp qua tất cả các cặp khóa-giá trị
Trước khi chúng ta khám phá các phương pháp khác nhau để lặp qua, hãy xem xét một từ điển mới được thiết kế để lưu trữ thông tin về một người dùng trên một trang web. Từ điển sau đây sẽ lưu trữ tên người dùng, tên đầu tiên và họ của một người:
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
Bạn có thể truy cập bất kỳ mẩu thông tin nào về user_0
dựa trên những gì bạn đã học trong chương này. Nhưng nếu bạn muốn xem tất cả thông tin được lưu trữ trong từ điển của người dùng này thì sao? Để làm điều đó, bạn có thể lặp qua từ điển bằng cách sử dụng vòng lặp for
:
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
print(f"\nKey: {key}")
print(f"Value: {value}")
Để viết một vòng lặp for
cho một từ điển, bạn tạo tên cho hai biến sẽ giữ khóa và giá trị trong mỗi cặp khóa-giá trị. Bạn có thể chọn bất kỳ tên nào bạn muốn cho hai biến này. Mã này sẽ hoạt động tốt nếu bạn sử dụng các từ viết tắt cho tên biến, như sau:
for k, v in user_0.items():
Nửa sau của câu lệnh for
bao gồm tên của từ điển theo sau là phương thức items()
, trả về một chuỗi các cặp khóa-giá trị. Vòng lặp for
sau đó gán mỗi cặp này cho hai biến được cung cấp. Trong ví dụ trước, chúng ta sử dụng các biến để in mỗi khóa, theo sau là giá trị tương ứng. Dấu "\n" trong lệnh print()
đầu tiên đảm bảo rằng một dòng trống được chèn trước mỗi cặp khóa-giá trị trong đầu ra:
Key: username
Value: efermi
Key: first
Value: enrico
Key: last
Value: fermi
Lặp qua tất cả các cặp khóa-giá trị hoạt động đặc biệt tốt cho các từ điển như ví dụ favorite_languages.py
, lưu trữ cùng loại thông tin cho nhiều khóa khác nhau. Nếu bạn lặp qua từ điển favorite_languages
, bạn sẽ nhận được tên của mỗi người trong từ điển và ngôn ngữ lập trình yêu thích của họ. Vì các khóa luôn đề cập đến tên của một người và giá trị luôn là một ngôn ngữ, chúng ta sẽ sử dụng các biến name
và language
trong vòng lặp thay vì key
và value
. Điều này sẽ làm cho dễ dàng hơn để theo dõi những gì đang xảy ra bên trong vòng lặp:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name, language in favorite_languages.items():
print(f"{name.title()}'s favorite language is {language.title()}.")
Mã này yêu cầu Python lặp qua mỗi cặp khóa-giá trị trong từ điển. Khi nó làm việc qua mỗi cặp, khóa được gán cho biến name
, và giá trị được gán cho biến language
. Những tên biến mô tả này làm cho dễ dàng hơn để thấy những gì lệnh print()
đang làm.
Bây giờ, chỉ trong vài dòng mã, chúng ta có thể hiển thị tất cả thông tin từ cuộc thăm dò:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Rust.
Phil's favorite language is Python.
Loại lặp này sẽ hoạt động tốt nếu từ điển của chúng ta lưu trữ kết quả từ việc thăm dò hàng ngàn hoặc thậm chí hàng triệu người.
Lặp qua tất cả các khóa trong từ điển
Phương thức keys()
hữu ích khi bạn không cần làm việc với tất cả các giá trị trong một từ điển. Hãy lặp qua từ điển favorite_languages
và in ra tên của tất cả những người đã tham gia cuộc thăm dò:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name in favorite_languages.keys():
print(name.title())
Vòng lặp for
này yêu cầu Python lấy tất cả các khóa từ từ điển favorite_languages
và gán chúng lần lượt cho biến name
. Đầu ra hiển thị tên của tất cả những người đã tham gia cuộc thăm dò:
Jen
Sarah
Edward
Phil
Lặp qua các khóa thực sự là hành vi mặc định khi lặp qua một từ điển, vì vậy mã này sẽ có cùng đầu ra nếu bạn viết:
for name in favorite_languages:
thay vì:
for name in favorite_languages.keys():
Bạn có thể chọn sử dụng phương thức keys()
một cách rõ ràng nếu nó làm cho mã của bạn dễ đọc hơn, hoặc bạn có thể bỏ qua nó nếu bạn muốn.
Bạn có thể truy cập giá trị tương ứng với bất kỳ khóa nào bạn quan tâm bên trong vòng lặp, bằng cách sử dụng khóa hiện tại. Hãy in ra một thông báo cho một vài người bạn về các ngôn ngữ mà họ đã chọn. Chúng ta sẽ lặp qua các tên trong từ điển như chúng ta đã làm trước đó, nhưng khi tên khớp với một trong những người bạn của chúng ta, chúng ta sẽ hiển thị một thông báo về ngôn ngữ yêu thích của họ:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
friends = ['phil', 'sarah']
for name in favorite_languages.keys():
print(f"Hi {name.title()}.")
if name in friends:
language = favorite_languages[name].title()
print(f"\t{name.title()}, I see you love {language}!")
Đầu tiên, chúng ta tạo một danh sách các người bạn mà chúng ta muốn in ra một thông báo. Bên trong vòng lặp, chúng ta in ra tên của mỗi người. Sau đó, chúng ta kiểm tra xem tên mà chúng ta đang làm việc có nằm trong danh sách friends
hay không. Nếu có, chúng ta xác định ngôn ngữ yêu thích của người đó bằng cách sử dụng tên của từ điển và giá trị hiện tại của name
làm khóa. Sau đó, chúng ta in ra một lời chào đặc biệt, bao gồm một tham chiếu đến ngôn ngữ mà họ đã chọn.
Tên của mọi người đều được in ra, nhưng những người bạn của chúng ta nhận được một thông báo đặc biệt:
Hi Jen.
Hi Sarah.
Sarah, I see you love C!
Hi Edward.
Hi Phil.
Phil, I see you love Python!
Bạn cũng có thể sử dụng phương thức keys()
để tìm hiểu xem một người cụ thể có tham gia cuộc thăm dò hay không. Lần này, hãy tìm hiểu xem Erin có tham gia cuộc thăm dò hay không:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
if 'erin' not in favorite_languages.keys():
print("Erin, please take our poll!")
Phương thức keys()
không chỉ dành cho việc lặp qua: nó thực sự trả về một chuỗi tất cả các khóa, và câu lệnh if
chỉ đơn giản kiểm tra xem 'erin' có nằm trong chuỗi này hay không. Vì cô ấy không có, một thông báo được in ra mời cô ấy tham gia cuộc thăm dò:
Erin, please take our poll!
Lặp qua các khóa của từ điển theo thứ tự cụ thể
Lặp qua một từ điển trả về các mục theo thứ tự mà chúng được chèn vào. Tuy nhiên, đôi khi bạn sẽ muốn lặp qua một từ điển theo thứ tự khác.
Một cách để làm điều này là sắp xếp các khóa khi chúng được trả về trong vòng lặp for
. Bạn có thể sử dụng hàm sorted()
để lấy một bản sao của các khóa theo thứ tự:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
for name in sorted(favorite_languages.keys()):
print(f"{name.title()}, thank you for taking the poll.")
Câu lệnh for
này giống như các câu lệnh for
khác, ngoại trừ việc chúng ta đã bao quanh phương thức dictionary.keys()
bằng hàm sorted()
. Điều này yêu cầu Python lấy tất cả các khóa trong từ điển và sắp xếp chúng trước khi bắt đầu vòng lặp. Đầu ra hiển thị tất cả những người đã tham gia cuộc thăm dò, với các tên được hiển thị theo thứ tự:
Edward, thank you for taking the poll.
Jen, thank you for taking the poll.
Phil, thank you for taking the poll.
Sarah, thank you for taking the poll.
Lặp qua tất cả các giá trị trong từ điển
Nếu bạn chủ yếu quan tâm đến các giá trị mà một từ điển chứa, bạn có thể sử dụng phương thức values()
để trả về một chuỗi các giá trị mà không có bất kỳ khóa nào. Ví dụ, giả sử chúng ta chỉ muốn một danh sách tất cả các ngôn ngữ được chọn trong cuộc thăm dò ngôn ngữ lập trình của chúng ta, mà không cần tên của người đã chọn mỗi ngôn ngữ:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in favorite_languages.values():
print(language.title())
Câu lệnh for
ở đây lấy mỗi giá trị từ từ điển và gán nó cho biến language
. Khi các giá trị này được in ra, chúng ta nhận được một danh sách tất cả các ngôn ngữ đã được chọn:
The following languages have been mentioned:
Python
C
Rust
Python
Cách tiếp cận này lấy tất cả các giá trị từ từ điển mà không kiểm tra các giá trị trùng lặp. Điều này có thể hoạt động tốt với một số lượng nhỏ các giá trị, nhưng trong một cuộc thăm dò với một số lượng lớn người tham gia, nó sẽ dẫn đến một danh sách rất lặp lại. Để xem mỗi ngôn ngữ được chọn mà không lặp lại, chúng ta có thể sử dụng một tập hợp (set). Một tập hợp là một tập hợp trong đó mỗi mục phải là duy nhất:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'rust',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
print(language.title())
Khi bạn bao quanh set()
một tập hợp các giá trị chứa các mục trùng lặp, Python xác định các mục duy nhất trong tập hợp và xây dựng một tập hợp từ các mục đó. Ở đây chúng ta sử dụng set()
để lấy các ngôn ngữ duy nhất trong favorite_languages.values()
.
Kết quả là một danh sách không lặp lại các ngôn ngữ đã được đề cập bởi những người tham gia cuộc thăm dò:
The following languages have been mentioned:
Python
C
Rust
Khi bạn tiếp tục học về Python, bạn sẽ thường xuyên tìm thấy một tính năng tích hợp của ngôn ngữ giúp bạn làm chính xác những gì bạn muốn với dữ liệu của mình.
Comments