【问题标题】:Python: Accessing Values For Dict Key Made Using VariablesPython:访问使用变量制作的字典键的值
【发布时间】:2010-07-24 15:48:23
【问题描述】:

您好,我一直在编写 Minesweeper 的控制台版本,只是为了学习 Python 的一些基础知识。它使用记录在字典中的坐标系。现在,我已经能够成功实现它,但是使用坐标的“x,y”变量访问或分配一个值给特定的坐标键似乎......笨拙。我想出了两种不同的方法,但是当我不得不经常使用它们时,它们似乎不太优雅。

for i in range(1, ROWS+1):
        for j in range(1, COLS+1):
            mine_field["%i,%i" % (i,j)] = 0

或

for i in range(1, ROWS+1):
        for j in range(1, COLS+1):
            mine_field[",".join([i, j])] = 0

它工作得很好,但在分配或交换值时确实开始看起来很乱。有没有更好的方法可以做到这一点?

提前致谢。

【问题讨论】:

    标签: python variables dictionary key


    【解决方案1】:

    为什么不简单地使用元组作为键?

    for i in range(1, ROWS+1):
        for j in range(1, COLS+1):
            mine_field[(i, j)] = 0 # you don't even need the parentheses!
    

    使用此方法,您可以使用逗号分隔的索引,如下所示:

    d = {(1,2):3}
    print d[1, 2] # will print 3
    

    顺便说一句,您为什么要使用基于 1 的索引?

    【讨论】:

    • 啊,是的,元组是解决我问题的完美解决方案。谢谢。并且以一为基础的索引在打印时主要是为了美观。 1,1 基本上是第一列中的第一个框。
    • 在处理输入/输出时,我经常发现它足以处理 +1/-1 转换,并在内部学习使用基于 0 的 Python(C 等)方式。
    • 我同意这一点。使用从零开始的索引更容易,并且仅在打印坐标时进行转换。
    【解决方案2】:

    如果将 mine_field 设为列表列表,则可以使用更好的语法:

    mine_field = [[0]*ROWS for i in range(COLS)]
    
    mine_field[i][j] = 1
    

    【讨论】:

    • 这是一个好点!我还没有尝试在 Python 中使用列表列表,所以我想我将创建一个 v2.0 并实现它以进行一些练习。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2020-08-08
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多