用字典简化啰嗦的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的语法,写出简洁的代码,始终是一种追求。

时间: 2024-10-16 12:35:50

用字典简化啰嗦的if条件的相关文章

2.1 如何在列表,字典,集合中根据条件帅选数据

#!/usr/bin/env python # -*- coding:utf-8 -*- #2.1 如何在列表,字典,集合中根据天剑筛选数据 # 帅选列表中符合条件的项 data = [1,5,-3,-2,6,8,0,9] res = [] for x in data: if x >=0: res.append(x) # print(res) #2 from random import randint data = [randint(-10,10) for _ in xrange(10)] m

Dictionary Learning(字典学习、稀疏表示以及其他)

第一部分 字典学习以及稀疏表示的概要 字典学习(Dictionary Learning)和稀疏表示(Sparse Representation)在学术界的正式称谓应该是稀疏字典学习(Sparse Dictionary Learning).该算法理论包含两个阶段:字典构建阶段(Dictionary Generate)和利用字典(稀疏的)表示样本阶段(Sparse coding with a precomputed dictionary).这两个阶段(如下图)的每个阶段都有许多不同算法可供选择,每种

python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器

python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 注: 本节代码是基于 Django 1.8,但 Django 1.4 - Djagno 1.9 操作流程也是一样的. 后文给出示例代码可以在 Django 1.4.x 到 Django 1.9.x 上运行. 不过还是强调一点,一点要动手敲代码!不要偷懒哦,动手才能学到真东西. 1. 创建一个 zqxt_tmpl 项目,和一个 名

Swift 字典的常用方法

/* * *要正确使用字典,也需要一些条件 * 1,字典键值对的键和值的类型必须明确,可以直接指定,也可以类似数组直接赋值由编译器自动识别 * 2,字典必须要初始化 * 3,键的类型必须是可以被哈希Hashable的(基本数据类型和可以被哈希的类) * */ //字典的几种声明方式 var dic1=[1:1,2:12,3:32,4:16,5:15] var dic2:Dictionary<String,String>=[:] var dic3=Dictionary<String,Str

你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句

4.2  条件选择语句 “老师,我这次四级考试过了没有?” 如果老师被问到这个问题,他会如何回答?是的,他会根据不同的条件选择不同的回答: 如果考试成绩大于等于60,那就回答:“恭喜你,你通过了这次考试”: 否则那就回答“很遗憾,你没有通过这次考试”. 这就是现实世界中的条件选择——根据不同的条件做出不同的动作.那么,在C++程序中,我们又该如何表达这种条件选择呢? 4.2.1  if语句:如果……就…… 在现实世界中,我们总是用“如果……,就……”的句式来表达条件选择,C++也向我们学习,提供

(转载)你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句

4.2  条件选择语句 “老师,我这次四级考试过了没有?” 如果老师被问到这个问题,他会如何回答?是的,他会根据不同的条件选择不同的回答: 如果考试成绩大于等于60,那就回答:“恭喜你,你通过了这次考试”: 否则那就回答“很遗憾,你没有通过这次考试”. 这就是现实世界中的条件选择——根据不同的条件做出不同的动作.那么,在C++程序中,我们又该如何表达这种条件选择呢? 4.2.1  if语句:如果……就…… 在现实世界中,我们总是用“如果……,就……”的句式来表达条件选择,C++也向我们学习,提供

ASP.NET 5运行时升级到Beta5

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在Visual Studio 2015 RTM和Windows 10正式发布之前,微软把开源.NET升级到了beta5,带来了一些增强和改变. 和Visual Studio 2015 RC一起安装的ASP.NET 5运行时是beta4,前几天微软发布了这个运行时的beta5版本.整个升级包括如下几个方面: .NET执行环境(DNX) 支持Nuget v3,恢复包的速度更快 支持全新的.NET目

2016&quot;百度之星&quot; - 资格赛(Astar Round1)-(模拟+线段树+乘法逆元)

Problem A Accepts: 1351 Submissions: 9951 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值.一个字符串的哈希值,由以下公式计算得到: H

2016百度之星总结帖

2016百度之星总结帖 测试赛 选的2015资格赛的部分题目,第二题字符串处理,第三题map计数 1001 大搬家 f f (x) = x 两次置换后回到原位 dp a->b && b->a,考虑n个数 如果它独自成对,那么就有s[n-1]: 如果它与前面某个成对,首先可以有n-1个可取,然后每个都有s[n-2]: 故s[n] = s[n-1] + (n-1)s[n-2]; 1004 放盘子 今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子