将整数元组作为键的KeyError

时间:2015-04-11 18:07:00

标签: python

以下是代码

values = { (0,0) : "_", (0,1) : "_", (0,2) : "_",
           (1,0) : "_", (1,1) : "_", (1,2) : "_",
           (2,0) : "_", (2,1) : "_", (2,2) : "_" }


def draw_matrix():
    matrix = "\t ___ ___ ___\n\t|_{(0,0)}_|_{(0,1)}_|_{(0,2)}_|\n\t|_{(1,0)}_|_{(1,1)}_|_{(1,2)}_|\n\t|_{(2,0)}_|_{(2,1)}_|_{(2,2)}_|"
    print(matrix.format(**values))
    print("\nUse numpad keys to enter your mark")

draw_matrix()

当我单独访问密钥值时,它可以正常工作。但是,由于某种原因,我无法使用.format()解压缩这个字典。

KeyError: '(0,0)'

如果我使用数字,它也是一样的。这将是一个井字游戏,所以我之前使用过小键盘。我不能将元组用作字符串,因为我需要使用它们来检查获胜条件。但这完全有效。

2 个答案:

答案 0 :(得分:3)

解决问题的最简单方法是在矩阵字符串中的元组元素之间添加空格,以便(0,0) => (0, 0)然后将元组转换为字符串表示形式:

matrix = "\t ___ ___ ___\n\t|_{(0, 0)}_|_{(0, 1)}_|_{(0, 2)}_|\n\t|_{(1, 0)}_|_{(1, 1)}_|_{(1, 2)}_|\n\t|_{(2, 0)}_|_{(2, 1)}_|_{(2, 2)}_|"
print(matrix.format(**{str(k): v for k,v in values.items()}))
 ___ ___ ___
|___|___|___|
|___|___|___|
|___|___|___|

虽然这种方法偶尔可以正常工作,但在未来的python版本中可能会破坏此代码(注意user2357112)。所以你应该在format函数中使用有效的关键字参数。例如:

matrix = "\t ___ ___ ___\n\t|_{c0_0}_|_{c0_1}_|_{c0_2}_|\n\t|_{c1_0}_|_{c1_1}_|_{c1_2}_|\n\t|_{c2_0}_|_{c2_1}_|_{c2_2}_|"
print(matrix.format(**{"c%d_%d"%k: v for k,v in values.items()}))

答案 1 :(得分:0)

ipoteka提供的解决方案有效,谢谢。我还想弄清楚元组不能用作关键值的原因。它们似乎单独工作(值[(0,0)]),但在解压缩字典时却没有。

元组可以用作键,因为它们具有唯一的哈希值,但它们不能用于需要标识符的位置,例如format()