2015-07-31 2 views
0

я работал над проблемой практики, где пользователь имеет опись сохраненную в качестве словаря, скажем, к примеру:Есть ли разумный способ добавить значения словаря без импорта библиотек?

inventory = { 
    'rope': 1, 
    'gold coin': 42, 
    } 

Затем мне нужно изменить его, добавив «бабло» в инвентарь позже.

Так, например:

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

я в конечном итоге делает это довольно легко с помощью Counter в collections так:

def add_to_inventory(original_inventory, added_items): 
    new_inventory = Counter(original_inventory) + Counter(added_items) 
    return(new_inventory) 

inventory = add_to_inventory(inventory, loot) 

С результатом является:

45: gold coin 
1: rope 
1: ruby 
1: dagger 

Какие все хорошо и прекрасно, но мне было интересно .. Есть ли разумный способ решить эту проблему без необходимости импортировать библиотеку?

+3

Что такое проблема с импортом библиотеки? Вы должны использовать BTL. – juanchopanza

+0

@juanchopanza Спасибо за подсказку! Нет ничего плохого в использовании библиотеки, мне нравится просто знать альтернативы. – ArnoldM904

ответ

5

Вы можете просто использовать get метод dict «s:

inventory = {'rope': 1, 'gold coin': 42,} 
loot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 

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

print inventory 

Выход:

{'rope': 1, 'gold coin': 45, 'dagger': 1, 'ruby': 1} 
+2

Я даже не подумал об этом, лучший ответ. – Delgan

3

Вы можете просто перебрать ключ инвентаризации и приращения, если он существует, в противном случае инициировать значение 1, используя EAFP подход:

for l in loot: 
    try: 
     inventory[l] += 1 
    except KeyError: 
     inventory[l] = 1 



Как вы говорите об альтернативах, есть также defaultdict объект из collections модуля, который является очень полезно:

from collections import defaultdict 

inventory = defaultdict(int) 
for l in loot: 
    inventory[l] += 1 
3

тот же ответ, что данный Delgan, но мы можем использовать SetDefault инициализировать

def add_to_inventory(inventory, loot): 
    for l in loot: 
     inventory[l] = inventory.setdefault(l, 0) + 1 
Смежные вопросы