我是靠谱客的博主 个性飞鸟,这篇文章主要介绍Python刷题常用数据结构,现在分享给大家,希望可以做个参考。

咱就是说,现在不用java刷题了,记录一下用python刷题的数据结构以及调用它们的方式。

链表

复制代码
1
2
3
head = ListNode() head.next = ListNode(val)

在链表head前加入哑结点:

复制代码
1
2
dump = ListNode(0, head)

集合

用于存放不重复的数

复制代码
1
2
3
4
5
6
sets = set() sets.add(val1) sets.remove(val2) #判断这个数是否在集合中: s[right + 1] not in sets

附:也可以用 seen = {1} (需要放入元素)直接创建集合
注意:**在集合中查找元素的效率比列表高很多!**我有一道题将List改成Set之后,时间没有超过限制过了!

字典

又叫哈希表,存储一些…温柔?

复制代码
1
2
3
4
5
6
7
8
9
hashtable = dict() #直接赋值 hashtable[nums[i]] = i #查字典 hashtable.get() #遍历完排序! res =[(x,y) for x,y in hashset.items()] res.sort()

当然也有默认字典类,这样不会出现找不到的情况

复制代码
1
2
3
from collections import defaultdict res = defaultdict(int/list)

构造参数决定了缺省值是什么,int就是0,list就是空列表[]

字符串

刷题时会用 [ ] 存储字符串,因为[ ]可以使用append等函数。
如[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’]
最后用

复制代码
1
2
''.join(a)

将序列的元素结合起来,得到一个完整的字符串’ABCDEF’
如果要反向连接,我们使用:

复制代码
1
2
"".join(a[::-1])

字符串对应的ASCALL码:
和ASCALL码对应的字符串:
可以记一下:a对应97,0对应48

复制代码
1
2
3
ord(s) chr(a)

将字符串变为大小写:

复制代码
1
2
3
4
a = 'deLDE' a = a.lower() a = a.upper()

非常重要!你无法改变字符串单个字符的值,只能把他转变为list再修改!

将小写或大写字母转变为0-26:

复制代码
1
2
3
4
import string cor = {v: i for i, v in enumerate(string.ascii_lowercase)} cor2 = {v: i for i, v in enumerate(string.ascii_uppercase)}

矩阵

一个初始化矩阵的方法

复制代码
1
2
mat = [[''] * c for _ in range(r)]

遍历矩阵元素的方法

复制代码
1
2
''.join(ch for row in mat for ch in row if ch)

如果将矩阵A的值赋值给矩阵B,正确和踩雷的做法是:

复制代码
1
2
3
matrix_B[:] = matrix_A #√ matrix_B = matrix_A

反转矩阵的行列值

复制代码
1
2
zip(*matrix)

举个例子 原矩阵是[[1,2,3],[4,5,6],[7,8,9]], zip*是反向拆开,结果变为[[1,4,7],[2,5,8],[3,6,9]]
顺带一提,还有另外一种用法:zip(a, b)

(最小)堆

需要:

复制代码
1
2
import heapq #载入heap库,heap指的是最小堆

数组转换为堆(堆仍然用 [ … ] 表示):

复制代码
1
2
3
4
heap = [1,3,4,2,6,8,9] heapq.heapify(heap) # heap = [1,2,4,3,6,8,9]

增加元素/删除元素(最小值):

复制代码
1
2
3
heapq.heappush(heap, 2) heapq.heappop(heap)

栈/队列

栈和队列不需要特地申明。使用[ ]就可以了,然后直接调用append、pop即可。

复制代码
1
2
3
4
5
A = [] A.append(1) A.pop() #栈! A.pop(0) #队列!

但也有一种比较标准的用法,采用的是python的collections库,是一个双端队列,可以进行各种操作。
9.4更新:如果A是空list,想要往里面添加元素3,不能用a = a.append(3)
直接用a.append(3)即可!

复制代码
1
2
3
4
5
6
a = collections.deque() a.append(b) #右边进(正常) a.appendleft(c) #左边进 a.pop() #右边出(类似栈) a.popleft() #左边进(类似队列)

排序函数

以[ ]为例,如果List里存放的是那种不好排序的元素,我们可以用排序函数定义。
假如List存放的是小List,[[1, 2], [3, 8], [2, 6]]

复制代码
1
2
intervals.sort(key=lambda x: x[0])

这样排序看的是每个元素的第一个元素,有关lambda的用法还是得熟练一下。
还有一点要注意!使用sort()时不要使用a = a.sort()! **直接a.sort()**就好了!

枚举

复制代码
1
2
for i, num in enumerate(nums,start = 0) #start默认从0开始

其中i是索引,num是值

排序集合

一个自动由小到大排序的集合,多元组的时候默认先排序第一个,第一个相同再排序第二个

复制代码
1
2
3
4
5
6
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
还有一种比较正式的:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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)

还有一个数位计数
统计每个数组出现的次数。

复制代码
1
2
3
4
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。
还有一种简单版本的。

复制代码
1
2
3
4
n = int(input()) # 棋盘nxn x1, y1 = map(int, input().split()) # B = list(map(int, input().split())) # 输入数组

max

max函数,如果参数是一维列表,返回的是一个数;如果是二维的,则返回一维(行)列表

四舍五入

复制代码
1
2
3
4
print(round(1.234, 2)) a = 1.1 print("%.2f"%a)

最大公约数(gcd)/最小公倍数(lcm)

复制代码
1
2
3
import math res = math.gcd(12,3)
复制代码
1
2
3
4
5
6
7
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)

回溯缓存

复制代码
1
2
3
import functools @functools.lru_cache(None)

最后

以上就是个性飞鸟最近收集整理的关于Python刷题常用数据结构的全部内容,更多相关Python刷题常用数据结构内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部