用字典简化啰嗦的if条件

今天这一题是关于一个小技巧。题目是这样的:

给定一个表示行进方向的列表,如["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"],对它进行简化。

如何简化呢?比如第一步是向北走,第二步是向南走,实际上相当于原地不动,这两步可以抵消。东西向也是同样的道理。

分析:

解法的逻辑非常简单,相当于把输入列表的元素依次加入一个栈(stack),如果要加入的元素与栈顶的元素可以抵消,则该元素不加入,且要pop栈顶的元素。

实现要点:

1. 如何表示“可以抵消”?

可以啰嗦的写为:

if (a == 'SOUTH' and b == 'NORTH') \

                or (a == 'NORTH' and b == 'SOUTH') \

                or (a == 'EAST' and b == 'WEST') \

                or (a == 'WEST' and b == 'EAST')

但是更简单的做法是事先创建一个字典:

opposite = {'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'}

则上述代码可以简化为:if a == opposite(b)

 

2. 栈的实现:

栈可以方便的用list实现。入栈用list.append(),出栈用list.pop(),栈顶元素为list[-1]。

借用某个源代码

opposite = {'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'}

def dirReduc(plan):
    new_plan = []
    for d in plan:
        if new_plan and new_plan[-1] == opposite[d]:
            new_plan.pop()
        else:
            new_plan.append(d)
    return new_plan

灵活运用Python的语法,写出简洁的代码,始终是一种追求。

posted on 2017-05-24 19:56  jennyz_2017  阅读(336)  评论(0编辑  收藏  举报

导航