【问题标题】:Dictionary key error despite the key existing尽管密钥存在,但字典密钥错误
【发布时间】:2016-02-17 21:42:54
【问题描述】:

我有点不知所措。我正在初始化字典中的字典,它工作正常,直到我想检查 while 语句中定义的值。

我收到“屏幕宽度”的关键错误。 我的第一次尝试是通过将整个字典写入 .txt 文件,然后是我在此期间访问的子字典部分本身来查看变量是否被意外修改......所有这些都有效并得到了我预期的结果但仍然在我发现关键错误的时候。

初始化:

    def __init__(self):
        self.Data = {
            'Configuration': { 'MaxMapWidth':  256, 'MaxMapHeight': 256,
                               'TileWidth':   1216, 'TileHeight':   694,
                               'ScreenWidth': 1366, 'ScreenHeight': 768,
                               'MaxBiewDistance': 10 },
            'Map': {},
            'Tiles': {},
            'Player': {
                'Position': { 'MapName': None, 'X': 1, 'Y': 1, 'Direction': 0 }# in degree }

            }
        }

方法:

   def MyDo(self):
        f = open("e:\\test\\test.txt", "w")
        for key in self.Data:
            f.write(key + "\n")
            for subkey in self.Data[key]:
                f.write("    " + subkey + "\n")

                if ("Configuration" in key):
                    f.write("          " + str(self.Data[key][subkey]) + "\n");
        rayNumber = 0

        f.write(str(self.Data['Configuration']['ScreenWidth']))
        while (rayNumber < self.Data['Configuration']['Screenwidth']):
            #.... do my thing
            rayNumber = rayNumber + 1

txt文件中的值:

Map
    Forest
Tiles
    tile003
    tile002
    tile001
    tile007
    tile006
    tile005
Configuration
    ScreenHeight
          768
    ScreenWidth
          1366
    MaxMapWidth
          256
    TileHeight
          694
    TileWidth
          1216
    MaxBiewDistance
          10
    MaxMapHeight
          256
Player
    Position
1366

除了关键错误,我想说这一切都按预期工作。所以我在这里的问题是是什么导致了这个关键错误(特别是因为它似乎都是正确的并且密钥存在)?

【问题讨论】:

  • 可能是因为'ScreenWidth' != 'Screenwidth'(区分大小写!)。请参阅 while 循环行。
  • tnx 读了好几个小时-.- 我看了所有的发音,....但不是大小写。 tnx
  • 顺便说一句,很高兴知道为什么 -1 (从我所看到的问题很清楚,它就像被忽略的大小写字母一样愚蠢,不应该奖励 - 就我而言'我知道因此很高兴知道为什么)

标签: python dictionary


【解决方案1】:

你犯了一个case错误——仔细看:

   f.write(str(self.Data['Configuration']['ScreenWidth']))
        while (rayNumber < self.Data['Configuration']['Screenwidth']):

第一次用大写的 W 拼写,第二次用小写的。这是两个不同的、不相关的子键。

【讨论】:

  • 就是这样。我真的很讨厌这种情况发生……除了w/W,我什么都看了。只要 stackoverflow 允许,tnx 就会接受
  • 区分大小写往往是一个麻烦而不是帮助——唉,Python 语言是区分大小写的,大多数文件系统也是如此,我讨厌这一点(我确实怀念 Pascal 的不区分大小写, 和 Windows 文件系统——尽管我并没有错过足够多的让我切换回这些技术的地方:-)。不过,至少对于您控制的数据结构,您可能会选择将所有键设为小写。
  • 多亏了 c#,我才习惯了驼峰式。否则我不会在 python 中打扰(这里也是 windows 用户^^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2014-02-10
  • 2020-07-23
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多