Python字典和选择大小写

Python字典和选择大小写,python,dictionary,Python,Dictionary,在尝试使用字典在python中实现类似开关大小写的场景时,我遇到了一个问题 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']

在尝试使用字典在python中实现类似开关大小写的场景时,我遇到了一个问题

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中是否有更优雅的切换案例处理方法?

您通常会为各种“切换案例”构建匿名函数

使用
lambda
创建匿名函数,并遵循语法
lambda args:return\u 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函数。这使得代码更加清晰、可重用。

谢谢。搜索后,我实现了lambda函数,没有参数。很高兴知道我用的是正确的东西。将以参数的形式传递该位置。@theSage-为了澄清,这些参数之所以是良好的做法,是因为它使您能够重新定位
移动的定义,而不会造成问题。不带args的lambda正在“捕获”
pos
变量,如果在循环外仅定义一次,则将失败。