Python List Loop Error:TypeError:list indices必须是整数,而不是str

时间:2015-07-11 07:29:35

标签: python list python-3.x dictionary

我要做的是检查' 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

3 个答案:

答案 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

至少它按预期工作。希望它可以帮助别人!