2017-08-27 51 views
3

所以我做一個遊戲,我有一個包含在球場上,看起來像這樣(例如)對象的座標元組的詞典:拆包元組在字典

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

總之,它沒有工作。我認爲問題在於解壓字典中的元組並將其用作從列表中獲取字母的數字。對不起,這是混亂,我會盡力回答你所有的問題。

+0

什麼是'player'? –

+1

另外,你可以舉一個你期待的輸出的例子嗎?目前尚不清楚。 –

+0

不清楚:「A」應該是「1」還是「0」? –

回答

6

這個問題的核心是如何轉換數字行/列座標更可讀(戰艦風格)。這是一個簡單而快速的功能:

>>> 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' 
+5

或'chr(65 + x)'而不是''ABCDEFGHIJKLOMOPQRSTUVWXYZ'[x]' - 但那不會很好地處理無效輸入。 IndexError可能比意想不到的角色更好。 – MSeifert

2

使用一個字典理解使用字符串格式來建立新的值。拆開值元組是很容易做到:

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

0

您可以使用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'}