码迷,mamicode.com
首页 > 其他好文 > 详细

用字典简化啰嗦的if条件

时间:2017-05-24 20:18:51      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:block   简洁   rect   new   创建   题目   append   技巧   灵活运用   

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

给定一个表示行进方向的列表,如["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的语法,写出简洁的代码,始终是一种追求。

用字典简化啰嗦的if条件

标签:block   简洁   rect   new   创建   题目   append   技巧   灵活运用   

原文地址:http://www.cnblogs.com/netoops/p/6900698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!