【问题标题】:Nonetype object has no attribute 'items' when looping through a dictionary遍历字典时,Nonetype 对象没有属性“项目”
【发布时间】:2016-03-19 19:02:12
【问题描述】:

我有两个字典,一个代表玩家物品栏,另一个代表龙物品栏。我正在尝试将这两个字典结合起来。然后将这两个字典显示为玩家的新库存。我在下面添加了我的代码,但我不断收到以下错误。

Traceback (most recent call last):
  File "/Users/DakotaDickey/Documents/Python Projects /Examples/FantasyGameAddToInventory.py", line 38, in <module>
    displayInventory(inv)
  File "/Users/DakotaDickey/Documents/Python Projects /Examples/FantasyGameAddToInventory.py", line 27, in displayInventory
    for k, v  in inventory.items():
AttributeError: 'NoneType' object has no attribute 'items'

我的代码:

#FantasyGameAddToInventory


def addToInventory(inventory, addedItems):
    addedItemsdict = {} 
    for item in addedItems:
        x = addedItems.count(item)
        if item not in addedItemsdict:
            addedItemsdict[item] = 1
        else:
            addedItemsdict[item] = x

    for k, v in addedItemsdict.items():
        if k in inventory:
            x = inventory[k]
            inventory[k] = v + x
        else:
            inventory[k] = v
    inv = inventory           
    print(inv)

def displayInventory(inventory):
    print('Inventory:')
    item_total = 0

    for k, v  in inventory.items():
        print(k,v)
        item_total = item_total + v



    print("Total number of items: " + str(item_total))

inv = {'gold coin' : 42 , 'rope': 1}
dragonLoot = ['gold coin', 'dagger' , 'gold coin', 'gold coin', 'ruby']
inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

我试图产生的输出如下。 库存:

45金币

1 根绳子

1颗红宝石

1 把匕首

项目总数:48

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    您的函数addToInventory() 返回None,您将其分配给inv

    inv = addToInventory(inv, dragonLoot)
    

    现在inv 设置为None,然后您将其传递给displayInventory()

    addToInventory()末尾添加return inv

    请记住,打印与返回不是一回事;打印将数据写入您的终端,函数的调用者不会收到该数据。

    【讨论】:

    • 完美运行!谢谢!
    【解决方案2】:

    或者,您可以将两个字典压缩在一起:

    inv = zip(inventory, dragonLoot)
    

    【讨论】:

      【解决方案3】:

      下面是编写 addToInventory(inventory, addedItems) 函数的更简洁的方法:

      def addToInventory(inventory, addedItems):
          for k in addedItems:
              if k not in inventory:
                  inventory.setdefault(k, 1)
              else:
                  inventory[k] += 1
          return inventory
      

      【讨论】:

      • 为什么在这里使用setdefault?您已经在检查键是否在字典中,并且不要使用返回值。
      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2018-05-23
      相关资源
      最近更新 更多