繁体   English   中英

Python列表循环错误:TypeError:列表索引必须是整数,而不是str

[英]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})

有关计数器的更多信息,请参见pymotw

我猜问题在这里-

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM