![](/img/trans.png)
[英]TypeError: list indices must be integers or slices, not str in python loop
[英]Python List Loop Error: TypeError: list indices must be integers, not str
我正在尝试做的是检查字典“ inv”键中是否存在“ dragonLoot”中的值。 如果是这样,我想将该值加1,否则,我想用该值创建一个新键并加1。
我想我已经得到了if,else部分是正确的,但是我有些难以使它循环并接收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)
我已经尝试过在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
为什么不使用计数器?
#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})
我猜问题在这里-
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}
我想我有点晚了,但是我在做同样的教程。 我想出的解决方案是:
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
至少它应该按预期工作。 希望它能对某人有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.