Python刷题常用数据结构

咱就是说,现在不用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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值