火车头
1 | from sys import stdin, stdout, setrecursionlimit |
IO
快读快写
1 | from sys import stdin, stdout, setrecursionlimit |
未知数据组数
1 | import sys |
一行读入多个变量
1 | n, m = map(int, input().split()) |
读入列表
一维
1 | arr = [int(_) for _ in input().split()] |
二维
读入类似于下面的二维数组:
1 | n m |
1 | n, m = map(int, input().split()) |
读入字符矩阵:
1 | n, m = map(int, input().split()) |
列表初始化
1 | n, m = map(int, input().split()) |
建图
不带权直接删除w即可
带权无向图
1 | n, m = map(int, input().split()) |
带权有向图
1 | n, m = map(int, input().split()) |
常用数据结构API
列表
int->list:
1 | num = 123 |
list->int:
1 | nums = [1, 2, 3] |
去重:
1 | arr = list(set(arr)) |
注意,列表自带字典序比较
队列
1 | from collections import deque |
优先队列
python库queue中自带的PriorityQueue是基于堆实现的优先队列
put()方法向队列中插入元素,可以是一个元组,第一个元素是优先级,第二个元素是实际数据get()方法从队列中拿出优先级最高(数字最小)的元素empty()方法用于判空qsize()方法用于返回队列大小
1 | import queue |
字典
1 | d.pop(key) # 返回 key 对应的 value,并在字典中删除这个键值对 |
结合zip使用
zip函数可以将多个可迭代对象中的对应元素打包成一个个元组
1 | keys = ['name', 'age'] |
Counter
python的counter类是字典的子类,键为待计数的元素,值为对应元素出现的次数
出现的次数允许0或负值,counter将不存在的元素次数设为0
实例化
必须进行实例化,可以为构造函数传参
1 | from collections import Counter |
之后可以用类似于字典添加元素的方式添加元素
1 | a['a'] = 1 |
方法
elements():返回一个迭代器,输出对应出现次数的元素
1 | c = Counter({'a':1, 'b':2, 'c':3}) |
most_common():返回一个出现次数从大到小的前k个元素的列表,复杂度缺省值为返回所有
输入k小于最长长度,返回前k个数
subtract():将两个counter对象中的元素对应计数相减
常规字典方法也对counter对象有效
map映射函数
可以将一个函数作用于一个或多个可迭代对象的元素上
一般使用lambda函数
1 | numbers = [1, 2, 3, 4, 5] |
类似的可以使用函数推导式
1 | numbers = [1, 2, 3, 4, 5] |
排序
内置排序
使用sorted()函数对可迭代对象排序
1 | sorted([5, 2, 3, 1, 4]) |
也可以使用list自带的方法list.sort()
使用reverse=True参数降序排序
重载小于号
对于自定义类型,可以通过重载小于号来自定义排序
1 | from typing import Self |
重载排序规则
可以将lambda函数传入key来自定义排序规则
key的排序规则是:先比较 key 的第一个元素,如果相同,再比较第二个
默认排序是升序,在元素前加上负号就可以变为降序了
1 | class Item: |
内置库二分
使用内置库bisect可以进行二分,第一个参数为查找的列表,第二个参数为要查找的数,返回值为结果的索引
bisect/bisect_right类似于upper_boundbisect_left类似于lower_bound
1 | from bisect import * |
给定一个单调不减的数组a,在
时间复杂度
语法糖
enumerate
enumerate() 函数用于将一个可遍历对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
1 | seq = ['one', 'two', 'three'] |
zip并行遍历
同时遍历两个可迭代对象:
1 | for a, b in zip(A, B): |
构造pair
1 | pairs = list(zip(A, B)) |
解包
1 | x, y = point |
还可以用星号解包
1 | a, *b = [1,2,3,4] |
any/all
any用于判断是否存在满足条件的
1 | any(x>5 for x in arr) |
all用于判断是否全部满足条件
1 | all(x>0 for x in arr) |
max/min 的key属性
可以设定key按照某个属性进行比较,对于自定义数据类型
1 | best = max(arr, key=lambda x:x.score) |