一些函数
1、strip()、lstrip()和rstrip()
strip()返回的是字符串的副本,并删除前导和后缀字符。如果参数为空,会默认删除字符串头和尾的空白字符(包括\n,\r,\t)。
lstrip()去掉左边的(头部);rstrip()去掉右边的(尾部)。
2、Counter()
统计字符串里每个字符个数
s = "bcabc"
Counter(s)
# 输出
Counter({'b': 2, 'c': 2, 'a': 1})
3、返回str形式
return ''.join()
4、set()
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
list1=[1,2,3,3]
s=set(list1)
add(key)往集合中添加元素,重复的元素自动过滤
remove(key)方法可以删除元素
交集,使用&操作符; 并集,使用|操作符
5、deque
deque是为了实现插入和删除操作的双向列表,适用于队列和栈
from collections import deque
d = deque()
# 添加元素
d.appendleft()
d.append()
# 删除元素
d.popleft()
d.pop()
# 逐个添加列表元素
d.extendleft()
d.extend()
# 清空
d.clear()
# e.g.
d=deque([1,2,3,4,5])
d.extend([0])
d=deque([1,2,3,4,5,0])
6、排序 sorted()
7、lambda() / filter() / reduce() / map()
map(function, iterable) 根据提供的函数对指定序列做映射
filter(function, iterable) 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
reduce(function, iterable)对参数序列中元素进行累积
lambda arguments: expression 创建匿名函数
def square(x) :
return x ** 2
list(map(square, [1,2,3,4,5])) # 使用 list() 转换为列表
# [1, 4, 9, 16, 25]
list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # 使用 lambda 匿名函数
# [1, 4, 9, 16, 25]
list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6]))
# [2, 4, 6]
reduce(lambda x, y: x * y, [1, 2, 3, 4, 5])
# 120
8、列表拷贝、切片、倒序
复制:
b=a 默认浅拷贝,即拷贝的是对象的地址,修改拷贝的值的时候原对象也a会随之改变。
使用narray.copy()进行深拷贝(b = a.copy()),即仅拷贝numpy对象中的数据。
切片:
# 切片案例
players = ['charles','martina','michael','florence','eli']
print(players[1:3])
print(players[:3])
print(players[3:])
print(players[-3:])
['martina', 'michael']
['charles', 'martina', 'michael']
['florence', 'eli']
['michael', 'florence', 'eli']
倒序reverse:
lista = [1, 2, 3, 4]
lista.reverse()
print(lista)
[4, 3, 2, 1]
一些算法
1、贪心
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。
nonlocal关键字用于在嵌套函数中声明一个非局部变量。它允许在内部函数中访问和修改外部函数的变量。
2、栈、队列
stack = [] #创建
stack.append() #入栈
stack.pop() #出栈
stack[-1] #最后一个数
3、堆
优先队列(特殊的完全二叉树)
最小堆:所有父结点都比子结点小 ; 最大堆:所有父结点都比子结点大
插入:先将新数据放在数组最后,重复判断是否交换插入元素和它的父节点(shift-up)。
import heapq
a = [] #创建一个空堆
# heapq.heappush()是往堆中添加新值,此时自动建立了小根堆
for i in [18, 1, 20, 10, 5, 200]:
heapq.heappush(a,i)
# 输出
[1, 5, 20, 18, 10, 200]
# 但heapq里面没有直接提供建立大根堆的方法,可以采取如下方法:
# 每次push时给元素加一个负号(即取相反数),此时最小值变最大值,
# 那么实际上的最大值就可以处于堆顶了,返回时再取负即可
# 列表转化为堆
a = [18, 1, 20, 10, 5, 200]
heapq.heapify(a)
heapq.heappop(a) # 从堆中弹出并返回最小的值
heapq.heappushpop(a,1) # 先加入1,再弹出并返回最小的值
4、双指针
通常一快一慢/一左一
右,可以大大降低时间复杂度,可用在数组,单链表等数据结构中。
一些概念
1、字典序
如”abc“ < “acb” < “acbd”, 其规则是先比较第一个字母,如果不相等,就直接得到结果,如果相等,就比较下一个字母。
如果两个字符串的长度不相等,但是长的那个字符串包含了短的那个,那长的那个字符串更大(比如"acb" < “acbd”)