咱就是说,现在不用java刷题了,记录一下用python刷题的数据结构以及调用它们的方式。
链表
1
2
3head = ListNode() head.next = ListNode(val)
在链表head前加入哑结点:
1
2dump = ListNode(0, head)
集合
用于存放不重复的数
1
2
3
4
5
6sets = 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
9hashtable = dict() #直接赋值 hashtable[nums[i]] = i #查字典 hashtable.get(键) #遍历完排序! res =[(x,y) for x,y in hashset.items()] res.sort()
当然也有默认字典类,这样不会出现找不到的情况
1
2
3from 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
3ord(s) chr(a)
将字符串变为大小写:
1
2
3
4a = 'deLDE' a = a.lower() a = a.upper()
非常重要!你无法改变字符串单个字符的值,只能把他转变为list再修改!
将小写或大写字母转变为0-26:
1
2
3
4import string cor = {v: i for i, v in enumerate(string.ascii_lowercase)} cor2 = {v: i for i, v in enumerate(string.ascii_uppercase)}
矩阵
一个初始化矩阵的方法
1
2mat = [[''] * c for _ in range(r)]
遍历矩阵元素的方法
1
2''.join(ch for row in mat for ch in row if ch)
如果将矩阵A的值赋值给矩阵B,正确和踩雷的做法是:
1
2
3matrix_B[:] = matrix_A #√ matrix_B = matrix_A #×
反转矩阵的行列值
1
2zip(*matrix)
举个例子 原矩阵是[[1,2,3],[4,5,6],[7,8,9]], zip*是反向拆开,结果变为[[1,4,7],[2,5,8],[3,6,9]]
顺带一提,还有另外一种用法:zip(a, b)
(最小)堆
需要:
1
2import heapq #载入heap库,heap指的是最小堆
数组转换为堆(堆仍然用 [ … ] 表示):
1
2
3
4heap = [1,3,4,2,6,8,9] heapq.heapify(heap) # heap = [1,2,4,3,6,8,9]
增加元素/删除元素(最小值):
1
2
3heapq.heappush(heap, 2) heapq.heappop(heap)
栈/队列
栈和队列不需要特地申明。使用[ ]就可以了,然后直接调用append、pop即可。
1
2
3
4
5A = [] 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
6a = collections.deque() a.append(b) #右边进(正常) a.appendleft(c) #左边进 a.pop() #右边出(类似栈) a.popleft() #左边进(类似队列)
排序函数
以[ ]为例,如果List里存放的是那种不好排序的元素,我们可以用排序函数定义。
假如List存放的是小List,[[1, 2], [3, 8], [2, 6]]
1
2intervals.sort(key=lambda x: x[0])
这样排序看的是每个元素的第一个元素,有关lambda的用法还是得熟练一下。
还有一点要注意!使用sort()时不要使用a = a.sort()! **直接a.sort()**就好了!
枚举
1
2for i, num in enumerate(nums,start = 0) #start默认从0开始
其中i是索引,num是值
排序集合
一个自动由小到大排序的集合,多元组的时候默认先排序第一个,第一个相同再排序第二个
1
2
3
4
5
6from 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
13from 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
4from 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
4n = int(input()) # 棋盘nxn x1, y1 = map(int, input().split()) # B = list(map(int, input().split())) # 输入数组
max
max函数,如果参数是一维列表,返回的是一个数;如果是二维的,则返回一维(行)列表
四舍五入
1
2
3
4print(round(1.234, 2)) a = 1.1 print("%.2f"%a)
最大公约数(gcd)/最小公倍数(lcm)
1
2
3import math res = math.gcd(12,3)
1
2
3
4
5
6
7def 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
3import functools @functools.lru_cache(None)
最后
以上就是个性飞鸟最近收集整理的关于Python刷题常用数据结构的全部内容,更多相关Python刷题常用数据结构内容请搜索靠谱客的其他文章。
发表评论 取消回复