admin 0Comment

To już czwarte zadanie praktyczne z kursu Automate the Boring Stuff with Python, nastawionego na praktyczną naukę programowania w języku Python. Jeśli nie znasz kursu lub nie czytałeś tekstu wyjaśniającego pomysł na serię wpisów, powinieneś zrobić to tutaj.

Dzisiejsze zadanie pochodzi z rozdziału piątego kursu i składa się z dwóch części. Część pierwsza:

Fantasy Game Inventory

You are creating a fantasy video game. The data structure to model the player’s inventory will be a dictionary where the keys are string values describing the item in the inventory and the value is an integer value detailing how many of that item the player has. For example, the dictionary value{‚rope’: 1, ‚torch’: 6, ‚gold coin’: 42, ‚dagger’: 1, ‚arrow’: 12} means the player has 1 rope, 6 torches, 42 gold coins, and so on.

Write a function named displayInventory() that would take any possible “inventory” and display it like the following:

Inventory:

12 arrow

42 gold coin

1 rope

6 torch

1 dagger

Total number of items: 62

Hint: You can use a for loop to loop through all the keys in a dictionary.

# 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 IN THE CODE HERE
    print("Total number of items: " + str(item_total))
displayInventory(stuff)

 

I część druga zadania:
List to Dictionary Function for Fantasy Game Inventory

Imagine that a vanquished dragon’s loot is represented as a list of strings like this:

dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

Write a function named addToInventory(inventory, addedItems), where the inventory parameter is a dictionary representing the player’s inventory (like in the previous project) and the addedItems parameter is a list like dragonLoot. The addToInventory() function should return a dictionary that represents the updated inventory. Note that the addedItems list can contain multiples of the same item. Your code could look something like this:

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)

The previous program (with your displayInventory() function from the previous project) would output the following:

Inventory:

45 gold coin

1 rope

1 ruby

1 dagger

Total number of items: 48

 

Zajmijmy się najpierw częścią numer jeden. Rozwiązanie nie powinno być problematyczne, autor podaje ramy kodu, w jakich powinniśmy je zamknąć. Nasze zadanie sprowadza się do iteracji po słowniku i wyświetleniu wartości klucza i samego klucza. Python umożliwia nam taką iterację w bardzo prosty sposób, jedyne o czym musimy dodatkowo pamiętać, to zamiana wartości kluczy na string, ponieważ w słowniku są one umieszczone jako wartość liczbowa. Oto rozwiązanie:

 

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)

 

Zgodnie z tekstem zadania funkcja powinna wyświetlić (dlatego wewnątrz używamy funkcji print) a nie zwrócić (wtedy użylibyśmy instrukcji return) wynik.

Kolej teraz na część drugą zadania. Ponownie autor podał nam część kodu, pozostaje nam tylko odkryć, w jaki sposób dodać elementy listy do kluczy i wartości słownika. Najlepszym rozwiązaniem jest opisanie, co funkcja powinna robić a potem przekonwertowanie opisu na działający kod. Możemy to ująć w ten sposób – dla każdego elementu listy chcemy sprawdzić czy w słowniku istnieje klucz o tej samej nazwie. Jeśli istnieje, do wartości tego klucza powinniśmy dodać jeden. Jeśli nie istnieje, do słownika powinniśmy dodać klucz o tej samej nazwie, co aktualnie wyszukiwany element listy i ustalić jego wartość na jeden. Jak więc wyglądałoby to, jako kod Pythona?:

for item in addedItems:
        if item in inventory.keys():
            inventory[item]+= 1 
        else:
            inventory[item] = 1

Wewnątrz funkcji nie powinniśmy tworzyć nowego słownika, musimy działać na tym, który został podany do funkcji w formie argumentu. W tym przypadku funkcja ma nie wyświetlać, ale zwracać nam zaktualizowany słownik wraz z danymi, użyjemy więc return:

def addToInventory(inventory, addedItems):
    for item in addedItems:
        if item in inventory.keys():
            inventory[item]+= 1 
        else:
            inventory[item] = 1
    return inventory
        
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

updatedInv = addToInventory(inv, dragonLoot)

A tak wyglądałoby całe zadanie, wykorzystujące obie napisane funkcje:

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))

def addToInventory(inventory, addedItems):
    for item in addedItems:
        if item in inventory.keys():
            inventory[item]+= 1 
        else:
            inventory[item] = 1
    return inventory
        
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

updatedInv = addToInventory(inv, dragonLoot)
    
displayInventory(updatedInv)

Raz jeszcze kluczem do uzyskania odpowiedzi jest opisanie tego co, krok po kroku, chcemy osiągnąć i ujęcie tego w formie kodu w języku Python.

Dodaj komentarz