概述
咱就是说,现在不用java刷题了,记录一下用python刷题的数据结构以及调用它们的方式。
链表
head = ListNode()
head.next = ListNode(val)
在链表head前加入哑结点:
dump = ListNode(0, head)
集合
用于存放不重复的数
sets = set()
sets.add(val1)
sets.remove(val2)
#判断这个数是否在集合中:
s[right + 1] not in sets
附:也可以用 seen = {1} (需要放入元素)直接创建集合
注意:**在集合中查找元素的效率比列表高很多!**我有一道题将List改成Set之后,时间没有超过限制过了!
字典
又叫哈希表,存储一些…温柔?
hashtable = dict()
#直接赋值
hashtable[nums[i]] = i
#查字典
hashtable.get(键)
#遍历完排序!
res =[(x,y) for x,y in hashset.items()]
res.sort()
当然也有默认字典类,这样不会出现找不到的情况
from collections import defaultdict
res = defaultdict(int/list)
构造参数决定了缺省值是什么,int就是0,list就是空列表[]
字符串
刷题时会用 [ ] 存储字符串,因为[ ]可以使用append等函数。
如[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’]
最后用
''.join(a)
将序列的元素结合起来,得到一个完整的字符串’ABCDEF’
如果要反向连接,我们使用:
"".join(a[::-1])
字符串对应的ASCALL码:
和ASCALL码对应的字符串:
可以记一下:a对应97,0对应48
ord(s)
chr(a)
将字符串变为大小写:
a = 'deLDE'
a = a.lower()
a = a.upper()
非常重要!你无法改变字符串单个字符的值,只能把他转变为list再修改!
将小写或大写字母转变为0-26:
import string
cor = {v: i for i, v in enumerate(string.ascii_lowercase)}
cor2 = {v: i for i, v in enumerate(string.ascii_uppercase)}
矩阵
一个初始化矩阵的方法
mat = [[''] * c for _ in range(r)]
遍历矩阵元素的方法
''.join(ch for row in mat for ch in row if ch)
如果将矩阵A的值赋值给矩阵B,正确和踩雷的做法是:
matrix_B[:] = matrix_A #√
matrix_B = matrix_A #×
反转矩阵的行列值
zip(*matrix)
举个例子 原矩阵是[[1,2,3],[4,5,6],[7,8,9]], zip*是反向拆开,结果变为[[1,4,7],[2,5,8],[3,6,9]]
顺带一提,还有另外一种用法:zip(a, b)
(最小)堆
需要:
import heapq #载入heap库,heap指的是最小堆
数组转换为堆(堆仍然用 [ … ] 表示):
heap = [1,3,4,2,6,8,9]
heapq.heapify(heap)
# heap = [1,2,4,3,6,8,9]
增加元素/删除元素(最小值):
heapq.heappush(heap, 2)
heapq.heappop(heap)
栈/队列
栈和队列不需要特地申明。使用[ ]就可以了,然后直接调用append、pop即可。
A = []
A.append(1)
A.pop() #栈!
A.pop(0) #队列!
但也有一种比较标准的用法,采用的是python的collections库,是一个双端队列,可以进行各种操作。
9.4更新:如果A是空list,想要往里面添加元素3,不能用a = a.append(3)
直接用a.append(3)即可!
a = collections.deque()
a.append(b) #右边进(正常)
a.appendleft(c) #左边进
a.pop() #右边出(类似栈)
a.popleft() #左边进(类似队列)
排序函数
以[ ]为例,如果List里存放的是那种不好排序的元素,我们可以用排序函数定义。
假如List存放的是小List,[[1, 2], [3, 8], [2, 6]]
intervals.sort(key=lambda x: x[0])
这样排序看的是每个元素的第一个元素,有关lambda的用法还是得熟练一下。
还有一点要注意!使用sort()时不要使用a = a.sort()! **直接a.sort()**就好了!
枚举
for i, num in enumerate(nums,start = 0) #start默认从0开始
其中i是索引,num是值
排序集合
一个自动由小到大排序的集合,多元组的时候默认先排序第一个,第一个相同再排序第二个
from sortedcontainers import SortedSet
a = SortedSet()
self.cs = defaultdict(SortedSet)
cs[0].add(1,'tiger')
cs[0].remove(1,'tiger')
第二步好秀
计数
对某一个数组的数字计数。
假设a = [1, 2, 1, 1, 4]
调用 a.count(a[0]) 得到3
还有一种比较正式的:
from collections import Counter
a = [1, 2, 1, 1, 4]
r = Counter(a)
#也可以统计字符串里的字符个数!
b = '124122'
r2 = Counter(b)
# 遍历法一:
for cnt in r.values():
print(cnt)
#遍历法二:
for i, j in r.items():
print(j)
还有一个数位计数
统计每个数组出现的次数。
from sympy.ntheory.factor_ import digits
a = 12311
digits(a,b=10)
输出一个list ,[10(进制),1,2,3,1,1]
可以配合
从键盘读数据
你可能会问,为什么map前还要加list(),它本来就是list啊。问题在于python3.x map函数返回的是迭代器,就是得再加一个list。
还有一种简单版本的。
n = int(input()) # 棋盘nxn
x1, y1 = map(int, input().split()) #
B = list(map(int, input().split())) # 输入数组
max
max函数,如果参数是一维列表,返回的是一个数;如果是二维的,则返回一维(行)列表
四舍五入
print(round(1.234, 2))
a = 1.1
print("%.2f"%a)
最大公约数(gcd)/最小公倍数(lcm)
import math
res = math.gcd(12,3)
def gcd(x, y):
return gcd(b, a%b) if b > 0 else a;
def lcm(x, y):
if (x == 0): return y
if (y == 0): return x
return x * y / gcd(x, y)
回溯缓存
import functools
@functools.lru_cache(None)
最后
以上就是个性飞鸟为你收集整理的Python刷题常用数据结构的全部内容,希望文章能够帮你解决Python刷题常用数据结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复