在字典中解压缩元组



所以我正在做一个游戏,我有一个元组字典,其中包含运动场上物体的坐标,看起来像这样(例如(:

location = {player : (1, 4), monster : (3, 2), escape : (4, 0)}

在我的代码后面,我想将坐标更改为更易于理解的区域。第一个定义部分是一个对应的字母,然后第二个定义部分是一个数字,看起来像这样:玩家在 B4 中,怪物在 C2 中,依此类推。右上角的"区域"由元组(4,4(表示,左下角的"区域"由元组(0,0(表示。我唯一能想到的可能有效的是这样的:

location = {player : (1, 4), monster : (3, 2), escape : (4, 0)}
letters = ["A", "B", "C", "D", "E"]
playerArea = "{}{}".format(letters[int(location[player[0]])+1], location[player[1]])

简而言之,它没有用。我认为问题在于从字典中解压缩元组并将其用作从列表字母中获取字母的数字。抱歉,这令人困惑,我会尽力回答您的所有问题。

问题的核心是如何将数字行/列坐标转换为更具可读性的东西(战舰风格(。 这是一个简单而快速的函数来做到这一点:

>>> def rc_to_abc(x, y):
return 'ABCDEFGHIJKLOMOPQRSTUVWXYZ'[x] + str(y)
>>> rc_to_abc(1, 4)
'B4'
>>> rc_to_abc(3, 2)
'D2'
>>> rc_to_abc(4, 0)
'E0'

使用使用字符串格式的字典推导来构建新值。解压缩值元组很容易完成:

location = {k: '{}{}'.format(letters[x-1], y) for k, (x, y) in location.items()}
print(location)
# {'player': 'A4', 'monster': 'C2', 'escape': 'D0'}

此外,您可以使用string.ascii_uppercase而不是手动定义字母列表。

OTOH,因为您的董事会应该(0, 0)不确定您打算如何看待指数0,因为A已经被视为1

您可以使用string.ascii_uppercase获取用于每个坐标的字母表的完整列表:

from string import ascii_uppercase as alphabet
location = {"player":(1, 4), "monster":(3, 2), "escape":(4, 0)}
new_location = {a:alphabet[b[0]-1]+str(b[-1]) for a, b in location.items()}
print(new_location)

输出:

{'player': 'A4', 'monster': 'C2', 'escape': 'D0'}

最新更新