ARTS挑战
Algorithm : 编程训练和学习 —— 每周至少做一个LeetCode算法题。
Review : 学习英文 —— 阅读并点评至少一篇英文技术文章。
Tip : 总结和归纳知识点 —— 学习至少一个技术技巧。
Share : 建立影响力,能够输出价值观 —— 分享一篇有观点和思考的技术文章。
文中涉及语言均为Python。
Algorithm
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
-
左括号必须用相同类型的右括号闭合。
-
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1: 输入: “()”,输出: true
示例 2: 输入: “()[]{}”,输出: true
示例 3: 输入: “(]” ,输出: false
示例 4: 输入: “([)]” , 输出: false
示例 5: 输入: “{[]}” , 输出: true
思路
-
如果是左括号,加入栈中;
-
如果是右括号,栈为空 直接返回False,栈不为空;
-
则看此对应左括号与栈顶元素是否一致,如果一致,将栈顶元素消除; 若完全配对,一一消除后栈中应为空,返回True;若仍有元素,返回False。
代码
class Solution: def isValid(self, s): """ :type s: str :rtype: bool """ stack = [] #创建栈 dic = {')': '(', '}': '{', ']': '['} #字典存储配对括号,右括号为键 for i in s: if i not in dic: #若i非右括号,即左括号 stack.append(i) #将左括号加入栈中 elif stack == [] or dic[i] != stack.pop(): #若i为右括号且栈为空,或右括号对应的左括号与栈顶元素不一致 return False return stack == []复制代码
时间复杂度:O(n),空间复杂度:O(n)。
Review
有关Python、NumPy、Pandas的8个重要概念:
- One-Line List Comprehension:Python特有的列表/字典推导式,代替for/if嵌套写法,简写为一行
l = [i*i for i in range(1,11) if (i % 2) == 0]d = {i:0 for i in list_b}复制代码
- Lambda Functions:Lambda表达式,代替简小函数式,省略函数命名(匿名函数)
- Map and Filter:Python内置函数
- :NumPy.arange
- What Axis Really Means
df.drop('Row A', axis=0) # axis=0 行df.drop('Column A', axis=1) # axis=1 列复制代码
从Pandas调用shape属性提供一个元组,其中第一个值表示行数,第二个值表示列数。如果考虑如何在Python中对其进行索引,“行”为0且“列”为1,与声明轴值的方式相似。
df.shape(# of Rows, # of Columns)复制代码
- :Pandas数据合并与重塑
- :Pandas之Series, Pandas.DataFrame
- :Pandas.pivot_table
Tips
Python内置函数: filter(), map(), reduce(), zip()
# filter(function or None, iterable)a = [1, 2, 3, 4, 5]print(list(filter(lambda x: x > 2, a))) # Output: [3, 4, 5]# map(func, *iterables) 多参数依次处理a = [1, 2, 3]b = [4, 5, 6]print(list(map(lambda x, y: x + y, a, b))) # Output: [5, 7, 9]# reduce(function, sequence[, initial) 需导入模块,不可直接使用from functools import reducereduce(lambda x, y: x + y, [1, 2, 3, 4, 5]) # 即((((1+2)+3)+4)+5)reduce(lambda x, y: x + y, [2, 3, 4, 5], 1) # 同上# zip() 将两元组纵向整合形成字典for i in zip((1, 2, 3), (4, 5, 6)): # zip()为可迭代函数,可用for搭配使用 print(i)Output: (1, 4)(2, 5)(3, 6)# zip() 实现字典键与值交换位置dict_a = { 'a': 'aa', 'b': 'bb'}dict_b = zip(dict_a.values(), dict_a.keys())print(dict(dict_b)) # Output: {'aa': 'a', 'bb': 'b'}复制代码
Share
Python项目的测试工具推荐:
适用macOS系统,Python3.7以上版本
- Install :代码格式化 - PEP 8 style ()
- Create .pycache:此配置文件主要用于上传包到PyPI时验证权限。在用户根目录下创建文件~/.pypirc
- Install :pytest是一个非常成熟的全功能的Python测试框架 ()
- Create Tests:以“test_”为开头命名文件,编写pytest测试样例
- for and Configure:Travis CI是一个在线分布式持续集成服务,用来构建及测试在GitHub托管的代码
- Create .travis.yaml:Travis 要求项目的根目录下面,必须有一个.travis.yml文件。这是配置文件,指定了 Travis 的行为。该文件必须保存在 Github 仓库里面,一旦代码仓库有新的 Commit,Travis 就会去找这个文件,执行里面的命令。
- Test Travis CI
- Add Code Coverage:计算pytest代码覆盖率,输出测试报告
- Add :报告自动测试的测试覆盖率
- Add :识别程序包关联项是否已过期或存在安全漏洞
Reference:
如有任何疑问或错误,欢迎指出。