1

我有一个以矩阵样式存储列表列表的类,它可以像 [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 的索引提供,从而返回我“牛”吗?

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

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])

抱歉,格式似乎有点混乱。

4

2 回答 2

1

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

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

更新:您的__getitem__方法不返回整数,它返回您的mapArray类的新实例。你的意思是只返回值本身吗?例如:

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]
于 2012-08-10T16:16:34.117 回答
0

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

我认为你的重载__getitem__应该是这样的

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

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

于 2012-08-10T16:57:15.413 回答