【问题标题】:Python List Loop Error: TypeError: list indices must be integers, not strPython 列表循环错误:TypeError:列表索引必须是整数,而不是 str
【发布时间】:2016-08-02 02:30:11
【问题描述】:

我要做的是检查字典中的“inv”键中是否存在“dragonLoot”中的值。如果是,我想给那个值加 1,如果不是,我想用那个值创建一个新键并加 1。

我想我已经得到了 if,else 部分正确,但我有些努力让它循环并接收 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']

#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 上找到的解决方案,但没有任何效果。是不是我造成的其他一些与循环本身无关的错误?

完整的追溯:

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

【问题讨论】:

  • 什么是完整的回溯?
  • Traceback(最近一次调用最后一次):文件“C:/Users/***/Dropbox/Programming/simpleGame.py”,第 19 行,在 inv = addToInventory(inv, dragonLoot ) 文件“C:/Users/***/Dropbox/Programming/simpleGame.py”,第 14 行,在 addToInventory if addedItems[i] in inventory.keys(): TypeError: list indices must be integers, not str跨度>
  • 仅供参考,您几乎不需要 .keys() - dict 上的 in 运算符已经检查了键列表。

标签: python list python-3.x dictionary


【解决方案1】:

为什么不使用计数器?

#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

【讨论】:

  • 不了解 Collections,将尝试。
  • Python 的标准库是您的朋友。避免重新发明轮子,除非是出于培训目的。
  • 我现在可以按照 Anand 所说的那样更改第 14 行,但是当我开始使用它时,我会用集合重写它来尝试一下。谢谢!编辑:是的,所有这些都是出于培训目的,我对列表、字典和函数非常不满意,所以我想“为什么不将它们全部添加到程序中,看看它是如何进行的”:)
  • 好的。顺便说一句,我已经编辑了我的答案,因为事情可以更简单:可以通过多种方式更新计数器,并且无需将列表更改为字典。您可以直接将列表传递给它(每个元素将计为 1)。玩得开心!
  • 刚刚试了一下。它变得多么容易!再次感谢,会记住并多研究标准库。
【解决方案2】:

我猜问题出在这里 -

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}

【讨论】:

  • 做到了,现在它转移到第 17 行的另一个错误,所以我可以修复它。谢谢!
  • 所有你必须使用i而不是addedItems[i]的地方。也更新了答案。
【解决方案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

至少它可以正常工作。希望它可以帮助某人!

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多