Bài 7.3. Python - Sử dụng vòng lặp while với List và từ điển

Cho đến nay, chúng ta chỉ làm việc với một mẩu thông tin người dùng tại một thời điểm. Chúng ta nhận đầu vào của người dùng và sau đó in đầu vào hoặc phản hồi lại nó. Lần tiếp theo qua vòng lặp while, chúng ta sẽ nhận một giá trị đầu vào khác và phản hồi lại nó. Nhưng để theo dõi nhiều người dùng và nhiều mẩu thông tin, chúng ta sẽ cần sử dụng danh sách và từ điển với các vòng lặp while.

Vòng lặp for hiệu quả để lặp qua một danh sách, nhưng bạn không nên sửa đổi một danh sách bên trong một vòng lặp for vì Python sẽ gặp khó khăn trong việc theo dõi các mục trong danh sách. Để sửa đổi một danh sách khi bạn làm việc qua nó, sử dụng vòng lặp while. Sử dụng vòng lặp while với danh sách và từ điển cho phép bạn thu thập, lưu trữ và tổ chức nhiều đầu vào để kiểm tra và báo cáo sau này.

Di chuyển các mục từ danh sách này sang danh sách khác

Hãy xem xét một danh sách các người dùng mới đăng ký nhưng chưa được xác minh của một trang web. Sau khi chúng ta xác minh những người dùng này, làm thế nào chúng ta có thể di chuyển họ sang một danh sách riêng của những người dùng đã được xác nhận? Một cách là sử dụng vòng lặp while để kéo người dùng từ danh sách người dùng chưa được xác nhận khi chúng ta xác minh họ và sau đó thêm họ vào một danh sách riêng của những người dùng đã được xác nhận. Đây là mã có thể trông như thế nào:

# Bắt đầu với những người dùng cần được xác minh,
# và một danh sách trống để chứa những người dùng đã được xác nhận.
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []

# Xác minh từng người dùng cho đến khi không còn người dùng chưa được xác minh.
# Di chuyển từng người dùng đã được xác minh vào danh sách người dùng đã được xác nhận.
while unconfirmed_users:
    current_user = unconfirmed_users.pop()
    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)

# Hiển thị tất cả những người dùng đã được xác nhận.
print("\nThe following users have been confirmed:")
for confirmed_user in confirmed_users:
    print(confirmed_user.title())

Chúng ta bắt đầu với một danh sách các người dùng chưa được xác minh (Alice, Brian và Candace) và một danh sách trống để chứa những người dùng đã được xác nhận. Vòng lặp while chạy miễn là danh sách unconfirmed_users không trống. Trong vòng lặp này, phương thức pop() loại bỏ từng người dùng chưa được xác minh một lần từ cuối danh sách unconfirmed_users. Vì Candace là người cuối cùng trong danh sách unconfirmed_users, tên của cô ấy sẽ là người đầu tiên bị loại bỏ, được gán cho current_user và thêm vào danh sách confirmed_users. Tiếp theo là Brian, sau đó là Alice.

Chúng ta mô phỏng việc xác minh từng người dùng bằng cách in ra một thông báo xác minh và sau đó thêm họ vào danh sách người dùng đã được xác nhận. Khi danh sách người dùng chưa được xác minh thu nhỏ lại, danh sách người dùng đã được xác nhận tăng lên. Khi danh sách người dùng chưa được xác minh trống, vòng lặp dừng lại và danh sách người dùng đã được xác nhận được in ra:

Verifying user: Candace
Verifying user: Brian
Verifying user: Alice
The following users have been confirmed:
Candace
Brian
Alice

Loại bỏ tất cả các trường hợp của các giá trị cụ thể khỏi danh sách

Trong Chương 3, chúng ta đã sử dụng remove() để loại bỏ một giá trị cụ thể khỏi danh sách. Hàm remove() hoạt động vì giá trị mà chúng ta quan tâm chỉ xuất hiện một lần trong danh sách. Nhưng điều gì sẽ xảy ra nếu bạn muốn loại bỏ tất cả các trường hợp của một giá trị khỏi danh sách?

Giả sử bạn có một danh sách các thú cưng với giá trị 'cat' lặp lại nhiều lần. Để loại bỏ tất cả các trường hợp của giá trị đó, bạn có thể chạy một vòng lặp while cho đến khi 'cat' không còn trong danh sách, như được hiển thị ở đây:

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
    pets.remove('cat')
print(pets)

Chúng ta bắt đầu với một danh sách chứa nhiều trường hợp của 'cat'. Sau khi in danh sách, Python vào vòng lặp while vì nó tìm thấy giá trị 'cat' trong danh sách ít nhất một lần. Một khi bên trong vòng lặp, Python loại bỏ trường hợp đầu tiên của 'cat', quay lại dòng while, và sau đó vào lại vòng lặp khi nó thấy rằng 'cat' vẫn còn trong danh sách. Nó loại bỏ từng trường hợp của 'cat' cho đến khi giá trị không còn trong danh sách, tại thời điểm đó Python thoát khỏi vòng lặp và in lại danh sách:

['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']

Điền vào từ điển với đầu vào của người dùng

Bạn có thể yêu cầu bao nhiêu đầu vào tùy thích trong mỗi lần qua vòng lặp while. Hãy tạo một chương trình thăm dò trong đó mỗi lần qua vòng lặp yêu cầu tên của người tham gia và phản hồi của họ. Chúng ta sẽ lưu trữ dữ liệu mà chúng ta thu thập trong một từ điển, vì chúng ta muốn kết nối mỗi phản hồi với một người dùng cụ thể:

responses = {}

# Đặt một cờ để chỉ ra rằng thăm dò đang hoạt động.
polling_active = True

while polling_active:
    # Yêu cầu tên và phản hồi của người tham gia.
    name = input("\nWhat is your name? ")
    response = input("Which mountain would you like to climb someday? ")

    # Lưu trữ phản hồi trong từ điển.
    responses[name] = response

    # Tìm hiểu xem có ai khác sẽ tham gia thăm dò không.
    repeat = input("Would you like to let another person respond? (yes/ no) ")
    if repeat == 'no':
        polling_active = False

# Thăm dò hoàn tất. Hiển thị kết quả.
print("\n--- Poll Results ---")
for name, response in responses.items():
    print(f"{name} would like to climb {response}.")

Chương trình đầu tiên định nghĩa một từ điển trống (responses) và đặt một cờ (polling_active) để chỉ ra rằng thăm dò đang hoạt động. Miễn là polling_active là True, Python sẽ chạy mã trong vòng lặp while.

Trong vòng lặp, người dùng được yêu cầu nhập tên của họ và một ngọn núi mà họ muốn leo lên. Thông tin đó được lưu trữ trong từ điển responses, và người dùng được hỏi liệu có muốn tiếp tục thăm dò hay không. Nếu họ nhập 'yes', chương trình vào lại vòng lặp while. Nếu họ nhập 'no', cờ polling_active được đặt thành False, vòng lặp while dừng chạy, và khối mã cuối cùng hiển thị kết quả của thăm dò.

Nếu bạn chạy chương trình này và nhập các phản hồi mẫu, bạn sẽ thấy đầu ra như sau:

What is your name? Eric
Which mountain would you like to climb someday? Denali
Would you like to let another person respond? (yes/ no) yes
What is your name? Lynn
Which mountain would you like to climb someday? Devil's Thumb
Would you like to let another person respond? (yes/ no) no
--- Poll Results ---
Eric would like to climb Denali.
Lynn would like to climb Devil's Thumb.

Làm thêm nhiều bài tập miễn phí tại đây

Comments

There are no comments at the moment.