Python: добавить список в словарь - PullRequest
0 голосов
/ 25 октября 2019

Я хочу добавить список элементов в существующий словарь, но я не получаю правильное количество элементов. Это мой код.

d = {'rope': 1, 'torch': 6, 'gold coin': 3, 'dagger': 1, 'arrow': 12}

def displayInventory(inventory):
    print('Inventory:')
    totnum = 0
    for k,v in d.items():
        print(v, k)
        totnum += v
    print('Total number of items: ' + str(totnum))

displayInventory(d)

print()

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

def addToInventory(inventory, add):
    new= dict.fromkeys(add, 1)
    for k, v in new.items():
        inventory[k] = v

z = addToInventory(d, dragonLoot)

displayInventory(d)

Ожидаемый результат должен быть таким

Inventory:
1 rope
6 torch
5 gold coin
2 dagger
12 arrow
1 ruby
Total number of items: 27

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Рассмотрите возможность реструктуризации и использования Counter, как показано ниже:

from collections import Counter

inventory = Counter({'rope': 1, 'torch': 6, 'gold coin': 3, 'dagger': 1, 'arrow': 12})


def displayInventory():

    print('Inventory:')

    for k, v in inventory.items():
        print(v, k)

    print(f'Total number of items: {sum(inventory.values())}')


displayInventory()

dragonLoot = ['gold coin', 'dagger', 'gold coin', 'ruby']
print('--Picked up loot!')

inventory.update(dragonLoot)

displayInventory()

Дает:

Inventory:
1 rope
6 torch
3 gold coin
1 dagger
12 arrow
Total number of items: 23
--Picked up loot!
Inventory:
1 rope
6 torch
5 gold coin
2 dagger
12 arrow
1 ruby
Total number of items: 27

Это также означает, что если вы можете безопасно проверить инвентарь на предметы, которых еще нет втам как:

print(inventory['diamond'])

, что дает:

0

(нормальный дикт должен поднять KeyError).

1 голос
/ 25 октября 2019

Это потому, что dict.fromkeys(add, 1) делает что-то еще, тогда вы думаете:

dragonLoot = ['gold coin', 'dagger', 'gold coin', 'ruby']
>>> dict.fromkeys(dragonLoot, 1)
{'gold coin': 1, 'ruby': 1, 'dagger': 1}

Так что он не считает случаи.

Я бы изменил функцию addToInventory на эту:

def addToInventory(inventory, add):
    for k in add:
        inventory[k] = inventory.get(k, 0) + 1

Итак, вы перебираете найденные предметы и добавляете их в инвентарь

0 голосов
/ 25 октября 2019

Возможно, вы захотите использовать collections.Counter. Если вы используете его, ваш мог бы выглядеть так:

d = Counter({'rope': 1, 'torch': 6, 'gold coin': 3, 'dagger': 1, 'arrow': 12})
loot = ['gold coin', 'dagger', 'gold coin', 'ruby']
d.update(loot)
print(d)
# Counter('rope': 1, 'torch': 6, 'gold coin': 5, 'dagger': 2, 'arrow': 12, 'ruby':1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...