将对象添加到字典中的现有值

时间:2013-07-25 11:03:24

标签: python dictionary python-3.x pygame

为了制作我自己的基于平铺的RPG,我有一个问题。 在创建我的图块地图期间,我有一个字典,我希望存储一对图块类型/矩形值,例如

{1: rect(0, 0, 32, 32), 2: rect(0, 32, 32, 32)}

我现在的问题是我必须给每个键多个值,因为只有一个有限的值 磁贴类型的数量,但每种类型的多个磁贴。 所以我尝试了这个:

def create(self):
    x, y = 0, 0
    for row in self.matrix:
        for tile in row:
            self.surface.blit(tiles[int(tile)].img, (x-camerax, y-cameray))
            tiles[int(tile)].rect = pygame.Rect(x-camerax, y-cameray, 32, 32)
            if numbers[tiles[int(tile)]] not in collision_list:
                collision_list[numbers[tiles[int(tile)]]] = tiles[int(tile)].rect
            else:
                dummytuple = collision_list[numbers[tiles[int(tile)]]]
                collision_list[numbers[tiles[int(tile)]]] = dummytuple, tiles[int(tile)].rect
            x += 32
            if x >= self.surface.get_width():
                y += 32
                x = 0

因为我不擅长编写简单的代码,所以可能有点复杂。 我的问题出在if else语句中。我用它们来检查字典collide_list中的一种类型的区块是否已经分配了一个或多个区域。 如果是这样,则应将现有的rect添加为键的第二个值。这种作品,但在shell中打印出来:

(((((((((((((((((((((((((((<rect(0, 0, 32, 32)>, <rect(32, 0, 32, 32)>), <rect(64, 0, 32, 32)>), <rect(96, 0, 32, 32)>), <rect(128, 0, 32, 32)>), <rect(160, 0, 32, 32)>), <rect(192, 0, 32, 32)>), <rect(224, 0, 32, 32)>), <rect(256, 0, 32, 32)>), <rect(288, 0, 32, 32)>), <rect(320, 0, 32, 32)>), <rect(352, 0, 32, 32)>), <rect(384, 0, 32, 32)>), <rect(416, 0, 32, 32)>), <rect(448, 0, 32, 32)>), <rect(0, 32, 32, 32)>), <rect(160, 32, 32, 32)>), <rect(192, 32, 32, 32)>), <rect(224, 32, 32, 32)>), <rect(256, 32, 32, 32)>), <rect(288, 32, 32, 32)>), <rect(320, 32, 32, 32)>), <rect(352, 32, 32, 32)>), <rect(384, 32, 32, 32)>), <rect(416, 32, 32, 32)>), <rect(448, 32, 32, 32)>), <rect(0, 64, 32, 32)>), <rect(32, 64, 32, 32)>)

这只适用于一个密钥(抱歉发送垃圾邮件)。这非常复杂,以后很难使用。 是否有更好的可能性将值连接到字典中的现有值? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您正在收集现有元组,然后创建一个嵌入其中的现有元组的 new 元组:

dummytuple = collision_list[numbers[tiles[int(tile)]]]
collision_list[numbers[tiles[int(tile)]]] = dummytuple, tiles[int(tile)].rect

相反,追加一个新的单元素元组:

dummytuple = collision_list[numbers[tiles[int(tile)]]]
collision_list[numbers[tiles[int(tile)]]] = dummytuple + (tiles[int(tile)].rect,)

你当然应该将你的单元素值保留为一个矩形,从单元素元组开始:

if numbers[tiles[int(tile)]] not in collision_list:
    collision_list[numbers[tiles[int(tile)]]] = (tiles[int(tile)].rect,)
else:
    dummytuple = collision_list[numbers[tiles[int(tile)]]]
    collision_list[numbers[tiles[int(tile)]]] = dummytuple + (tiles[int(tile)].rect,)

或者,更好的是,使用列表,你毕竟经常改变它:

if numbers[tiles[int(tile)]] not in collision_list:
    collision_list[numbers[tiles[int(tile)]]] = [tiles[int(tile)].rect]
else:
    collision_list[numbers[tiles[int(tile)]]].append(tiles[int(tile)].rect)

如果您collision_list成为collections.defaultdict object,您甚至不必首先测试密钥:

from collections import defaultdict

collision_list = defaultdict(list)

# ....

# No `if numbers[tiles[int(tile)]] not in collision_list` needed
collision_list[numbers[tiles[int(tile)]]].append(tiles[int(tile)].rect)