【问题标题】:Python iterating through lists and dictionariesPython 遍历列表和字典
【发布时间】:2015-11-15 05:07:48
【问题描述】:

这是一个来自 python 书籍的测试项目。我正在尝试遍历列表并检查每个项目是否是字典中的键。如果是,则将 1 添加到字典值,如果不添加键,然后将值设置为 1。这是我到目前为止的代码:

inv_original = {'gold coin' : 42, 'rope' : 1}
dragonloot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

def addtoinventory(dict_a, addeditems):
    for i in addeditems:
        if dict_a.has_key(i):
            dict_a[str(i)] = dict_a.get(i, 0) + 1
        else:
            dict_a[str(i)] = 1
        return dict_a

    inv = addtoinventory(inv_original, dragonloot)

    print inv

它似乎有效,但仅适用于列表中的第一项,它不会遍历其余部分。有人可以帮忙吗?

【问题讨论】:

  • 你回来得太早了。专业提示:Don't use has_key,只需使用if i in dict_a:

标签: python dictionary


【解决方案1】:

您的函数在完成第一次迭代后返回。

def addtoinventory(dict_a, addeditems):
    for i in addeditems:
        if dict_a.has_key(i):
            dict_a[str(i)] = dict_a.get(i, 0) + 1
        else:
            dict_a[str(i)] = 1
        return dict_a     # <----- issue here
# ...

您应该将 return 语句移到循环主体之外,方法是将行取消缩进 4 个空格以解决问题。您还应该考虑:

  • 使用try/except 块而不是if/else
  • 删除str(i) 调用;您的列表元素已经是字符串,因此无需尝试对它们进行字符串转换,并且
  • 改进了变量名称(例如,inventory 代替了dict_aitems 代替了addeditems,这可能是多余的——如果它在列表中,它显然已经被添加了:)

更新后的代码如下:

#!/usr/bin/python

inv_original = {'gold coin' : 42, 'rope' : 1}
dragonloot   = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

def addtoinventory(inventory, items):
    for i in items:
        try:
            inventory[i] += 1
        except KeyError:
            inventory[i] = 1

    return inventory

#
print addtoinventory(inv_original, dragonloot)
# ...

代码的输出现在是:{'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1},表明gold coin 键增加了3,并且添加了其他键/值对,正如您所料。

【讨论】: