仅在一个特定情况下Python字典键错误

时间:2012-08-10 16:12:54

标签: python dictionary

我有一个以矩阵样式存储列表列表的类,它可以像[x,y]一样编入索引。

现在我有这些设置:

test_dict = {1:"cow",2:"horse"}

randommap = mapArray(None, (20,20))

随机地图只填充了1的列表。所以任何索引都会返回1.但是这里是我迷路的地方,可能是因为对字典的工作方式存在误解:

test_dict[1]

这显然是回归“牛” 和

randommap[1,1] #or any two x,y values up to 20 for that matter

给我的值为1。

但是为什么这会给我一个关键错误:

test_dict[randommap[1,1]]

在单独的情况下,索引randommap会给我一个值1,所以不应该将1作为test_dict的索引提供,从而返回“cow”?

更新: 这些是我认为导致问题的两种方法。看来他们正在返回字符串而不是整数,但我不知道如果我完全理解两者之间的区别。

def __str__(self):
    return str(self.mapdata)

def __repr__(self):
    return str(self.mapdata)

以下是重载的__getitem__方法:

def __getitem__(self, (x,y)):
    #Just reverses it so it works intuitively and the array is 
    # indexed simply like map[x,y] instead of map[y][x]
    return mapArray(self.mapdata[y][x])

抱歉,格式化似乎已经搞砸了。

2 个答案:

答案 0 :(得分:1)

1(和整数),"1"(一个字符串)和__repr__()方法在调用时返回字符串"1"的任何自定义类之间存在差异。它们都将在控制台中以1打印,但不等同于dict查找。

您需要检查type(randommap[1, 1])确实是int

更新:您的__getitem__方法不返回整数,它会返回mapArray类的新实例。你的意思是只返回价值观吗? E.g:

def __getitem__(self, (x,y)):
    #Just reverses it so it works intuitively and the array is 
    # indexed simply like map[x,y] instead of map[y][x]
    return self.mapdata[y][x]

答案 1 :(得分:0)

鉴于更新的问题,似乎__getitem__返回一个新的mapArray。

我认为您的重载__getitem__应该类似于

def __getitem__(self, (x,y)):
    return self.mapdata[y][x] 

相反,(假设[y] [x]顺序是故意的)。