[ATBS2nd]Chương 1 - Python cơ bản - Phần 20

Chào các bạn,
Chúng ta lại tiếp tục với phần cuối của từ điển trong Python sau những trận gây war kéo view căng thẳng :)))).
Kết hợp giữa danh sách và tự điển
Mô hình hóa một bảng tic-tac-toe khá đơn giản: bảng chỉ cần một giá trị từ điển duy nhất với chín cặp khóa-giá trị. Khi bạn mô hình hóa những thứ phức tạp hơn, bạn có thể thấy bạn cần từ điển và danh sách có chứa các từ điển và danh sách khác. Danh sách rất hữu ích để chứa một chuỗi các giá trị được sắp xếp và từ điển rất hữu ích để liên kết các khóa với các giá trị. Ví dụ, ở đây, một chương trình sử dụng một từ điển có chứa các từ điển khác về những món đồ mà khách đang mang đi dã ngoại. Hàm totalBrought() có thể đọc cấu trúc dữ liệu này và tính tổng số lượng vật phẩm được mang bởi tất cả khách.

allGuests = {'Alice': {'apples': 5, 'pretzels': 12},
	'Bob': {'ham sandwiches': 3, 'apples': 2},
	'Carol': {'cups': 3, 'apple pies': 1}}
def totalBrought(guests, item):
	numBrought = 0
	for k, v in guests.items():
		numBrought = numBrought + v.get(item, 0)
	return numBrought
print('Number of things being brought:')
print(' - Apples ' + str(totalBrought(allGuests, 'apples')))
print(' - Cups ' + str(totalBrought(allGuests, 'cups')))
print(' - Cakes ' + str(totalBrought(allGuests, 'cakes')))
print(' - Ham Sandwiches ' + str(totalBrought(allGuests, 'ham sandwiches')))
print(' - Apple Pies ' + str(totalBrought(allGuests, 'apple pies')))

Bên trong hàm totalBrought(), vòng lặp for lặp lại qua các cặp khóa-giá trị trong guests. Trong vòng lặp, chuỗi tên của guests được gán cho k và từ điển của các vật phẩm dã ngoại mà chúng mang đến được gán cho v. Nếu tham số vật phẩm tồn tại dưới dạng khóa trong từ điển này, giá trị của nó (số lượng) được thêm vào để numBrought. Nếu nó không tồn tại dưới dạng khóa, phương thức get () trả về 0 để được thêm vào numBrought. Đầu ra của chương trình này trông như thế này:

Number of things being brought:
- Apples 7
- Cups 3
- Cakes 0
- Ham Sandwiches 3
- Apple Pies 1

Điều này có vẻ như là một điều đơn giản như vậy để mô hình hóa mà bạn sẽ không cần phải bận tâm với việc viết một chương trình để làm điều đó. Nhưng nhận ra rằng cùng hàm totalBrought() này có thể dễ dàng xử lý một từ điển chứa hàng ngàn khách, mỗi người mang đến hàng ngàn mặt hàng dã ngoại khác nhau. Sau đó, việc có thông tin này trong cấu trúc dữ liệu cùng với hàm totalBrought() sẽ giúp bạn tiết kiệm rất nhiều thời gian!
Bạn có thể mô hình hóa mọi thứ với cấu trúc dữ liệu theo bất kỳ cách nào bạn muốn, miễn là phần còn lại của mã trong chương trình của bạn có thể hoạt động chính xác với mô hình dữ liệu. Khi bạn mới bắt đầu lập trình, đừng lo lắng nhiều về cách thức đúng đắn để mô hình hóa dữ liệu. Khi bạn có được nhiều kinh nghiệm hơn, bạn có thể đưa ra các mô hình hiệu quả hơn, nhưng điều quan trọng là mô hình dữ liệu hoạt động theo nhu cầu của chương trình của bạn.
Tổng kết
Bạn đã học tất cả về từ điển trong chương này. Danh sách và từ điển là các giá trị có thể chứa nhiều giá trị, bao gồm các danh sách và từ điển khác. Từ điển rất hữu ích vì bạn có thể ánh xạ một mục (khóa) sang mục khác (giá trị), trái ngược với danh sách, chỉ đơn giản chứa một loạt các giá trị theo thứ tự. Các giá trị trong từ điển được truy cập bằng dấu ngoặc vuông giống như với danh sách. Thay vì một chỉ mục số nguyên, từ điển có thể có các khóa thuộc nhiều loại dữ liệu: số nguyên, số thực, chuỗi hoặc tuple. Bằng cách tổ chức một giá trị chương trình thành các cấu trúc dữ liệu, bạn có thể tạo các biểu diễn của các đối tượng trong thế giới thực. Bạn đã thấy một ví dụ về điều này với một bảng tic-tac-toe.
Câu hỏi

  1. Một từ điển rỗng trông như thế nào?

  2. Một từ điển có khóa là ‘foo’ và giá trị là 42 trông như thế nào?

  3. Những điểm khác nhau chính giữa một danh sách và một từ điển?

  4. Điều gì diễn ra khi bạn cố truy nhập spam[‘foo’] nếu spam chứa {‘bar’: 100}

  5. Nếu spam là một từ điển, thì điều gì là khác nhau giữa ‘cat’ trong spam và ‘cat’ trong spam.keys()?

  6. Nếu spam là một từ điển, thì điều gì là khác nhau giữa ‘cat’ trong spam và ‘cat’ trong spam.values()?

  7. Đoạn code sau mô tả điều gì

if 'color' not in spam:
    spam['color'] = 'black'
  1. Module và hàm nào được sử dụng để in đẹp(“pretty print”) giá trị trong từ điển.

Bài tập
Chess Dictionary Validator
Trong chương này, chúng tôi đã sử dụng giá trị từ điển {‘1h’: ‘bking’, ‘6c’: ‘wqueen’, ‘2g’: ‘bbishop’, ‘5h’: ‘bqueen’, ‘3e’: ‘wking’} để đại diện cho một bàn cờ.
Viết hàm có tên isValidChessBoard () nhận đối số từ điển và trả về True hoặc False tùy thuộc vào việc bảng có hợp lệ hay không.
Một bảng hợp lệ sẽ có chính xác một vua đen và chính xác một trắng nhà vua. Mỗi người chơi chỉ có thể có tối đa 16 quân cờ, tối đa 8 quân tốt và tất cả các quân cờ phải ở trên một không gian hợp lệ từ ‘1a’ đến ‘8h’; nghĩa là, một mảnh không thể được đặt trên không gian ‘9z’. Tên các mảnh bắt đầu bằng chữ ‘w’ hoặc ‘b’ để thể hiện màu trắng hoặc đen, theo sau là ‘pawn’, ‘knight’, ‘bishop’, ‘rook’, ‘queen’, or ‘king’(‘tốt’, ‘ngựa’, ‘tượng’, ‘xe’, ‘hậu’ hoặc ‘vua’). Chức năng này sẽ phát hiện khi một lỗi đã dẫn đến một bàn cờ không đúng.
Fantasy Game Inventory
Bạn đang tạo ra một trò chơi video tưởng tượng. Cấu trúc dữ liệu để mô hình hóa tài sản của người chơi sẽ là một từ điển trong đó các khóa là các giá trị chuỗi mô tả vật phẩm trong kho và giá trị là một giá trị nguyên chi tiết có bao nhiêu vật phẩm mà người chơi có. Ví dụ: giá trị từ điển {‘rope’: 1, ‘torch’: 6, ‘gold coin’: 42, ‘dagger’: 1, ‘arrow’: 12} có nghĩa là người chơi có 1 rope, 6 torches, 42 gold coins, và vân vân.
Viết một hàm có tên displayInventory() sẽ lấy bất kỳ khoảng không quảng cáo nào có thể có được và hiển thị nó như sau:

Inventory:
12 arrow
42 gold coin
1 rope
6 torch
1 dagger
Total number of items: 62

Gợi ý: Bạn có thể sử dụng vòng lặp for để lặp qua tất cả các khóa trong từ điển.

# inventory.py
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
def displayInventory(inventory):
	print("Inventory:")
	item_total = 0
	for k, v in inventory.items():
	# FILL THIS PART IN
		print("Total number of items: " + str(item_total))
	
displayInventory(stuff)

Hàm chuyển từ danh sách sang từ điển trong trò chơi Fantasy Game Inventory
Hãy tưởng tượng rằng một kho báu rồng sau khi bị đánh bại được thể hiện dưới dạng một danh sách các chuỗi như thế này:
`

dragonLoot = [‘gold coin’, ‘dagger’, ‘gold coin’, ‘gold coin’, ‘ruby’]

`
Viết hàm có tên addToInventory (inventory, addItems), trong đó tham số inventory là một từ điển đại diện cho kho của người chơi (như trong dự án trước) và tham số addItems là một danh sách như dragonLoot.
Hàm addToInventory () sẽ trả về một từ điển đại diện cho inventory được cập nhật. Lưu ý rằng danh sách addItems có thể chứa bội số của cùng một mục. Mã của bạn có thể trông giống như thế này:

def addToInventory(inventory, addedItems):
	# your code goes here
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

Chương trình trước đó (với chức năng displayInventory() của bạn từ dự án trước đó) sẽ xuất ra như sau:

Inventory:
45 gold coin
1 rope
1 ruby
1 dagger
Total number of items: 48

Người dịch: Hungdh

3 Likes

Mình giải bài tập Fantasy Game Inventory các bạn cho ý kiến.

# This is simple program about inventory
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}


def displayInventory(inventory):
    print("Inventory: ")
    item_total = 0
    for k, v in inventory.items():
        print(str(v) + ' ' + k)
        item_total += v

    print("Total number of items: " + str(item_total))


displayInventory(stuff)
1 Like

Mình đề xuất giữ nguyên các từ “dictionary”, “key” và “value” để dễ phản xạ hơn khi tham chiếu các tài liệu khác

1 Like

Cám ơn bạn đã góp ý. Chúng tôi sẽ sửa trong thời gian sớm nhất. Trân trọng những góp ý của bạn.

1 Like