Python 字典和选择大小写

标签 python dictionary

在尝试使用字典在 python 中实现类似于 switch case 的场景时,我遇到了一个问题。

pos=(0,0)
move={'up':(pos[0],pos[1]+1),'dn':(pos[0],pos[1]-1)}
newpos=move['up']
pos=newpos

这正如预期的那样工作。但是当我做这样的事情时。

pos=(0,0)
move={'up':(pos[0],pos[1]+1),'dn':(pos[0],pos[1]-1)}
moves_list=['up','up','dn','dn']#or anything else for that matter
for mo in moves_list:
    pos=move[mo]
print pos

这段代码应该给我最终的位置(0,0) 但是我得到 (0,-1)

我理解这是因为 move['up'] 和 move['down'] 的值是根据字典的定义计算的。 如果是这种情况,每当我需要定义计算密集型算法来查找下一个位置时,我都会浪费时间计算可能永远不会使用的移动。 例如。如果 move_list 只是 ['up,'up'] 则不需要计算 'dn'。

我的问题

有什么方法可以阻止这些值的计算,直到它们被实际调用为止?

在 python 中是否有更优雅的 switch-case 方法?

最佳答案

您通常会为各种“switch case”构建匿名函数。

匿名函数是使用lambda创建的,并遵循语法lambda args: return_value

例如,这个函数接受一个数字作为输入并返回该数字加 1:

add_one = lambda x: x + 1

像这样的东西会起作用:

moves = {
        'up': lambda (x,y): (x, y+1),
        'dn': lambda (x,y): (x, y-1),
    }

然后你可以采取行动:

pos = moves[move](pos)

请注意,将显式参数带入 lambda 函数通常是一个更好的主意。这允许更清晰和更可重用的代码。

关于Python 字典和选择大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049523/

相关文章:

Python repr 和将类实例作为参数传递

python - 计算网络中所有可能配对的连接总和

python - 如何绕过kivy模块错误: ImportError: DLL load failed: The specified module could not be found?

python - 在 python 中,为什么列表与列表不同[ :]?

python - 破解编码面试,第 6 版,1.7

c++ - 迭代 std::map,做错事,提示迭代器缺少 '=' 运算符

ios - 如何在 Swift 中做嵌套字典

Python 字典吃掉了 ram

python - python字典中的多个键,可能吗?

python - 执行 python 脚本并读取其 JSON 输出