Python 用于存储游戏地图的列表或字典

Python 用于存储游戏地图的列表或字典,python,list,dictionary,Python,List,Dictionary,因此,我目前有一个2d对象列表,用于定义游戏地图,其中每个对象表示该地图上的一个平铺。当我将代码重新用于其他用途时,我想知道使用字典存储地图数据或继续使用列表是否更有意义。对于列表,索引表示映射的x和y,而在字典中,(x,y)元组将是字典的键 我问这个问题的原因是因为地图更改是一个罕见的事件,所以数据是相当静态的,据我所知,在字典中相当恒定的查找速度会更快。它还应该简化绘制地图的循环。大多数情况下,我认为使用字典可以简化数据访问,尽管我不确定在所有情况下都是这样 这些好处值得我假设字典占用的额外

因此,我目前有一个2d对象列表,用于定义游戏地图,其中每个对象表示该地图上的一个平铺。当我将代码重新用于其他用途时,我想知道使用字典存储地图数据或继续使用列表是否更有意义。对于列表,索引表示映射的x和y,而在字典中,(x,y)元组将是字典的键

我问这个问题的原因是因为地图更改是一个罕见的事件,所以数据是相当静态的,据我所知,在字典中相当恒定的查找速度会更快。它还应该简化绘制地图的循环。大多数情况下,我认为使用字典可以简化数据访问,尽管我不确定在所有情况下都是这样

这些好处值得我假设字典占用的额外内存吗?还是说我说的好处就是好处是对的

编辑 我知道当前的方法是有效的,更重要的是,为了拥有更干净的代码和发现任何潜在的缺点,切换是否有意义。 像在数组中循环这样的东西

for i in range(size[0]):
    for e in range(size[1]):
        thing.blit(....using i and e)

或者查找dict项目将是

def get(x, y):
    if (x in range(size[0])) and (y in range(size[1])):
        return self.map[x][y].tile


它不多,但有点干净,如果它不慢,也没有其他缺点,我认为没有理由不这样做。

我会对过早优化保持警惕

您当前的方法是否有不可接受的性能?您使用的数据结构是否使您的代码更难推理或编写


如果没有一个特定的问题是您当前的体系结构无法解决的,那么我会小心更改它。

这是一个很好的答案,可以参考python列表与字典的速度和内存使用情况:


在你得到一个难以置信的大数据集之前,如果你当前的方法对你来说运行良好,那么它很可能会非常适合你。

我不确定你是否能得到“正确”的答案,但当我用Python创建“生命游戏”时,我使用了一个
dict
。实际上,多维列表的查找成本与
dict
中的查找成本之间不应有实质性差异(两者都是O(1)),但如果您使用的是
dict
,则无需担心实例化整个游戏板。在国际象棋中,这意味着您只创建了32个棋子,而不是64个方块和32个棋子。另一方面,在围棋游戏中,你只能创建一个对象,而不是361个列表单元格


也就是说,对于dict,您需要实例化
元组。如果您可以缓存这些(或者只迭代
dict
的键),那么您可能会得到最好的结果。

正如我所说,我正在重新调整此映射结构的用途以用于其他用途,因此此时架构更改并不重要。是的,现有的解决方案是可行的,但我认为我看到了字典可能带来的一些优势,尽管我不想切换,如果它会因为某种原因使它运行得明显更糟,或者如果有其他事情我没有想到,从长远来看可能会使使用字典变得不受欢迎,我的观点是,除非存在性能问题,或者处理的数据量太大,以至于性能差异很小,否则请选择概念上最干净的体系结构,而不是性能最好的体系结构。是的,这就是我添加到问题中的原因。从概念上讲,我想象自己使用它的方式更清晰,但是如果你或其他人看到了一个潜在的缺陷,比如“当然可以,但是如果你想在周界上做一个循环,那就更难了,因为a和b(这实际上不是一个问题)那我很乐意听你这么说。这就大大澄清了你的问题。您可能还希望在代码审阅站点上发布。我能想象到的唯一缺点是,比较给定的图块和附近的图块可能会比较困难,因为列表切片语法使这非常容易。如果你愿意的话,我可以扩展一下。我的第一个想法是,当你说这类似于tiles[I-1:I+1][e-1:e+1],但我不确定这是否会起作用(逻辑上,这将形成一个3x3列表)在我的情况下,没有一个tiles是无数据的,因为它们包含tileset信息,因此,我必须实例化整个矩形,也可以考虑使用具有包含AM x/y(或类似)CORDS的属性的节点的图形,该瓦片的对象,以及表示可以从/移动到的瓦片的边。也可能考虑边缘的重量,以便从草原通过沼泽/河流等。比搬到另一片草地还难。。。
def get(x, y):
    if (x in range(size[0])) and (y in range(size[1])):
        return self.map[x][y].tile
def get(item):
    return self.dict.get(item)