【问题标题】:Reading from subdict in python3从 python3 中的 subdict 读取
【发布时间】:2016-01-21 02:13:11
【问题描述】:

我有 2 个字典。一个包含本地玩家数据,一个列出玩家的子字典:

      class GameData:
        def __init__(self):
          self.player  =  {'id'           : 1453339642,
                           'positionX'    : 123,
                           'positionY'    : 0
                          }

          self.players =  {1453339642:
                                  {'name'         : "Admin"}
                          }
     gameData = GameData()

然后我打印出来只是为了检查一切是否正常:

            for x in gameData.player:
                print (str(x),':',gameData.player[x])

            print("\n\n")

            for x in gameData.players:
                print (str(x))
                for y in gameData.players[x]:
                    print ('    ',y,':',gameData.players[x][y])
            print("\n\n")

这会导致:

            id : 1453339642
            positionY : 0
            positionX : 123

            1453339642
                 name : Admin

当我现在想在玩家中访问玩家的 id 时,例如使用

            #print(str(type(gameData.player)))
            #print(str(type(gameData.players)))
            print(str(type(gameData.players[1453339642])))

结果我得到了 KEYERROR。为什么?

【问题讨论】:

  • gameData = GameData() 行是否正确缩进?
  • 是的,我只是将它错误地复制到了 stackoverflow 框中。如您所见,字典和子字典在那里,我可以打印出来。不知何故我无法访问特定密钥?
  • 您的打印结果有些奇怪:positionX 应该是 123。我重新输入了您的代码,它可以工作。在实例化和最终打印之间,gameData 是否发生了什么事?
  • 哎呀是的。抱歉,现在也更正了。

标签: python-3.x keyerror


【解决方案1】:

如果我把它放在一个文件中,它可以工作:

class GameData:
    def __init__(self):
        self.player  =  {'id'           : 1453339642,
                         'positionX'    : 123,
                         'positionY'    : 0
        }

        self.players =  {1453339642:
                         {'name'         : "Admin"}
        }
gameData = GameData()
print(str(type(gameData.players[1453339642])))

只有缩进与您的代码不同。在实例化和最终的print 之间,gameData 一定发生了什么事。

【讨论】:

  • 我现在检查了所有类型:它说播放器中的 1453339642 是 int 但在播放器中它是一个字符串。如何在播放器中将其转换为 str?
  • 是的,这绝对是我的问题,因为它将我的字典键创建为字符串。这有效: print(str(type(gameData.players[str(1453339642)])))
  • 我不确定是否理解。查看您的代码,gameData.player['id'] 是一个 int(值周围没有引号)。 gameData.players 中的 1453339642 也是如此:它是一个 int,因为它周围没有引号。
  • 是的,我从一个更大的项目中总结了它。在这个项目中,我使用 gameData.players.update({ID 附加到字典,然后出于某种原因将其创建为字符串,我仍然没有得到。
  • 我明白了。您可以使用 int(id) 转换为 int。另外,你可以print(gameData.players),你会看到你的键是字符串还是数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多