刷题所需的python语法
最近想通过刷题来熟悉python的语法,将一些注意点记录在本篇博客中。
参考链接:
0. 输入输出
# 接收参数
# 1 2
# 3 4
# map()能将序列映射到指定的数据类型上
a, b = map(int, input().split())
c, d = map(int, input().split())
1. String 字符串
函数名 | 说明 |
---|---|
len(str) | 获取字符串的长度 |
s.split(str, num) | str 为分隔符。默认为空字符,如空格、换行符等。num 为分割次数。默认为-1,表示分割所有。 |
s.join(seq) | 用s 作为连接符,将列表seq 连接在一起 |
# split()
str = "aaa bbb ccc"
print(str.split())
# 输出为['aaa', 'bbb', 'ccc']
# join()
seq = ["aa", "bb", "cc"]
print(" ".join(seq))
# 输出为'aa bb cc'
2. list 列表
初始化
# 一维数组
arr = [0 for _ range(n)]
# 二维数组
matrix = [[0 for _ in range(j)] for _ in range(i)]
函数名 | 说明 |
---|---|
len(list) | 获取list的长度 |
list.append(obj) | 在列表末尾添加新的对象 |
list.pop([index=-1]) | 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
list.remove(obj) | 移除列表中某个值的第一个匹配项 |
list.count(obj) | 统计obj在列表中出现的次数 |
list.reverse() | 反转列表 |
list.sort(cmp=None, key=None, reverse=False) | reverse=False表示升序 |
3. dict 字典
dict能提供 key-value 映射,作用类似于Java中的map。
注意:
- key必须是不可变的,如数字、元组、字符串。不可以为列表。
- 不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
# 创建字典
tinyDict = {'a': 1, 'b': 2, 'b':3}
# {'a': 1, 'b': '3'}
# 增加条目、修改条目
tinyDict['d'] = 4
# 删除条目
del tinyDict['d']
# 删除字典
del tinyDict
函数名 | 说明 |
---|---|
len(d) | 计算字典元素个数,即键的总数。 |
d.clear() | 清空字典 |
d.keys() | 以列表返回字典中的所有键 |
d.values() | 以列表返回字典中的所有值 |
defaultdict
defaultdict
与普通字典的区别:
- 当你尝试访问或修改一个不存在的键时,
defaultdict
会自动为该键创建并生成一个默认值。
如下所示,创建了一个键为数字,值为列表的字典。然后可以直接通过map[1].append()
对列表进行操作。
from collections import defaultdict
map = defaultdict(list)
map[1].append(2)
4. set 集合
创建集合:
# 创建空集合
set1 = set()
# 用列表创建集合
set2 = set([1,1,2,3])
# set2 = {1,2,3}
使用in
判断元素是否在集合中:
if x in set1:
pass
函数名 | 说明 |
---|---|
s.add(obj) | 添加元素 |
len(s) | 获取集合的长度 |
s.remove(obj) | 删除元素,如果不存在该元素,会报错 |
s.discard(obj) | 删除元素,如果不存在该元素,不会报错 |
s.clear() | 清空集合 |
s.intersection(s1, s2, s3, ...) | 返回s,s1,s2,...的交集 |
s.union(s1, s2, ...) | 返回s,s1,s2,...的并集 |
5. 队列
heapq 优先队列(堆队列,小根堆)
python3 中的 heapq
实现的是小根堆,即父节点小于子节点。
如果要实现大根堆,需要对每个元素乘上-1,这样元素越大,负数越小,位于对的顶端。
import heapq
pq = []
heapq.heappush(pq, item)
函数名 | 说明 | 时间复杂度 |
---|---|---|
heapq.heappush(pq, item) | 向堆中添加item | \(O(logn)\) |
item = heapq.heappop(pq) | 弹出堆顶元素,即堆中的最小值 | \(O(logn)\) |
heapq.heapify(pq) | 将列表pq转转化为小根堆 | \(O(n)\) |
不同item的比较方式:
元组
:堆会根据元组的第一个元素进行排序。如果第一个元素相等,则会比较第二个元素,依此类推。这是因为元组的比较是逐元素进行的。类对象
:如果item为对象,确保类中实现了__lt__
方法(小于比较),来指定排序的规则。
import heapq
class MyObject:
def __init__(self, priority, value):
self.priority = priority
self.value = value
def __lt__(self, other):
return self.priority < other.priority # 根据 priority 进行比较
# 创建一个空堆
heap = []
# 添加对象到堆中
heapq.heappush(heap, MyObject(1, 'A'))
heapq.heappush(heap, MyObject(3, 'B'))
heapq.heappush(heap, MyObject(2, 'C'))
# >>> [(1, 'A'), (2, 'C'), (3, 'B')]