我要做的是检查' dragonLoot'中的值。存在于dictionairy' inv'键。如果是这样,我想为该值添加1,如果不是,我想创建一个具有该值的新键并添加1.
我认为我已经获得了if,else部分正确,但我有点想让它循环并重现 TypeError:list indices必须是整数,而不是str 错误。这是代码:
#Inventory and the Loot value
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
#Function to loop through the items in the list
def displayInventory(inventory):
print('Inventory:')
item_total = 0
for j, k in inventory.items():
print(str(k) + ' ' + j)
item_total += k
print('Total number of items: %s' % str(item_total))
#Where the problem occur
def addToInventory(inventory, addedItems):
for i in addedItems:
if addedItems[i] in inventory.keys():
#Edit: I see an error here now, but I will fix it after I get the loop working
inventory[addedItems[i]] + 1
else:
inventory.setdefault(addedItems[i], 1)
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)
我已经尝试了很多我在StackOverflow上找到的其他解决方案,但没有任何诀窍。是否可能导致其他一些与Loop本身无关的错误?
完整追溯:
Traceback (most recent call last):
File "C:/Users/*****/Dropbox/*****", line 19, in <module>
inv = addToInventory(inv, dragonLoot)
File "C:/Users/*****/Dropbox/*****", line 14, in addToInventory
if addedItems[i] in inventory.keys():
TypeError: list indices must be integers, not str
答案 0 :(得分:2)
为什么不使用计数器?
#Inventory and the Loot value
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
import collections
inv = collections.Counter(inv)
inv.update(dragonLoot)
print inv
产生
Counter({'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1})
有关计数器的详情,请参阅pymotw
答案 1 :(得分:1)
我猜这个问题就在这里 -
def addToInventory(inventory, addedItems):
for i in addedItems:
if addedItems[i] in inventory.keys(): #<--- guessing this is the line.
问题是,当你执行for i in addedItems:
时,它会循环遍历列表中的元素,而不是列表索引。所以i
会是 - 'gold coin'
,然后是'dagger'
等项目。不是列表的索引,因此您可以将检查作为 - if i in inventory.keys():
。代码 -
def addToInventory(inventory, addedItems):
for i in addedItems:
if i in inventory.keys():
inventory[i] + 1
else:
inventory.setdefault(i, 1)
对于您的情况,要计算列表中的项目数,您可以使用 - collections.Counter
示例 -
>>> import collections
>>> dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
>>> invt = dict(collections.Counter(dragonLoot))
>>> invt
{'ruby': 1, 'dagger': 1, 'gold coin': 3}
答案 2 :(得分:0)
我想有点晚了,但我正在做同样的教程。我想出的解决方案是:
def addToInventory(inventory, addedItems):
for i in range(len(addedItems)):
if addedItems[i] in inventory:
inventory[addedItems[i]] += 1
else:
inventory.setdefault(addedItems[i],1)
return inventory
至少它按预期工作。希望它可以帮助别人!