[英]Python/Pygame colours are no tuples: unhashable type error when used as dictionary keys
粗糙的背景:
我在Python / Pygame中編寫了一些函數,用於從彩色迷你地圖創建平鋪的水平地圖。 小像素上的一個像素代表大像素上的某種類型的圖塊。
現在我發現,盡管看起來像這樣,但使用Pygame的surface.get_at((x,y))得到的顏色不是元組。
黑色表面上的get_at結果的簡短示例:
surf = pygame.Surface((64, 64)).convert()
surf.fill((0, 0, 0))
print(surf.get_at((32, 32))
打印:
(0, 0, 0, 255)
所以我想,創建一個以顏色為鍵的字典就像這樣:
tiledict = {(0, 0, 0, 255): [tile list 1], (255, 0, 0, 255): [tile list 2], etc}
for y in range(0, tilemap.get_height()):
for x in range(0, tilemap.get_width()):
clr = tilemap.get_at((x, y))
lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]
結果:
lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]
TypeError: unhashable type: 'pygame.Color'
但是,當我在將顏色用作鍵之前將顏色定義為元組時,它可以工作:
GRAY = (128, 128, 128, 255)
print(GRAY == clr)
產量:
True
我有我的解決方法:我使字典鍵成為所有字符串,然后以這種方式進行get_at調用
clr = str(tilemap.get_at((x, y)))
有人知道這里的問題是什么嗎? 我覺得這很有趣。 顏色不是元組,因此不能散列,但是當我問是否等於元組時,返回的是“ True”。
我還嘗試將所有顏色定義為元組,並且效果也很好。 但是這種方法比我當前的方法慢得多。
有人知道我可以嘗試其他類型的事情嗎?
等於運算符適用於元組和pygame.Color的事實並不意味着您可以使用pygame.Color索引到字典中。 您在想這是相同的比較,但是命令需要關鍵對象是可哈希的。
PyGame.Color
類型專門支持與元組的比較 ,前提是該元組的長度為3或4,並且包含0-255范圍內的整數(請參閱RGBAFromObj
源 )。
這在PyGame.Color頁面上有明確記錄:
顏色對象支持與其他顏色對象以及3或4個整數元素元組的相等比較
任何 Python類都可以通過實現__eq__
方法來實現自定義相等性測試。
該類型還將所有內容實現為一個序列,返回R,G,B和A組件; 您可以通過在其上調用tuple()
將PyGame.Color
轉換為元tuple()
:
tiledict[tuple(clr)]
並通過簡單地將元組作為單獨的參數傳遞,將其轉換回PyGame.Color
對象:
pygame.Color(*tuple_of_rgba_ints)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.