2015-07-11 96 views
0

我想要做的是检查'dragonLoot'中的值是否存在于dictionairy'inv'键中。如果是这样,我想添加1到该值,如果没有,我想要创建一个新的密钥与该值,并添加1.Python列表循环错误:TypeError:列表索引必须是整数,而不是str

我想我已经得到的if,否则部分正确,但我一些如何struggeling得到它循环和reciving一个TypeError:列表索引必须是整数,而不是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) 

我已经tryed很多其他的解决方案我已经在这里找到在计算器上,但没有做的伎俩。这可能是我造成的与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

什么是完整的追溯? –

+0

Traceback(最近一次调用最后一次): 文件“C:/ Users/***/Dropbox/Programming/simpleGame.py”,第19行,在 inv = addToInventory(inv,dragonLoot) 文件“C:/用户/ ***/Dropbox /编程/ simpleGame.py“,第14行,在addToInventory 如果在inventory.keys()中addedItems [i]: TypeError:列表索引必须是整数,而不是str – Salviati

+2

仅供参考,从不需要'.keys()' - 字典中的'in'运算符已经检查了键列表。 – ThiefMaster

回答

2

-

def addToInventory(inventory, addedItems): 
    for i in addedItems: 
     if i in inventory.keys(): 
      inventory[i] + 1 
     else: 
      inventory.setdefault(i, 1) 

对于你的情况,要计算列表中的项目的数量,你可以使用 - collections.Counter

实例?

#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对计数器

+0

不知道集合,会尝试它。 – Salviati

+3

Python的标准库是你的朋友。除非是为了训练目的,否则避免重新发明车轮。 – Pynchia

+0

我现在正在努力改变第14行,因为Anand说,但是当我得到它的工作,我会用集合重写它,而不是尝试它。谢谢!编辑:是的,所有这些都是为了培训的目的,我对列表,字典和函数都很不满,所以我想到了“为什么不把它们全部添加到程序中,看看它是怎么回事”:) – Salviati

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():。码 - 为什么不使用计数器

>>> import collections 
>>> dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 
>>> invt = dict(collections.Counter(dragonLoot)) 
>>> invt 
{'ruby': 1, 'dagger': 1, 'gold coin': 3} 
+0

这样做,现在它转移到第17行的其他错误,所以我可以修复它。谢谢! – Salviati

+0

所有的地方,你必须使用'我'而不是'addedItems [我]'。在答案中也更新了这一点。 –

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

至少它可以作为它应该。希望它能帮助别人!

相关问题