Python OI 基础(语言篇)

警告
本文最后更新于 2022-04-08,文中内容可能已过时。

基本

输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def cin1():
    return [int(i) for i in input().split()]


def cin2():
    return map(int, input().split())


def cin3():
    return list(map(int, input().split()))


# 输入一个常数
n, = cin()  # 注意','
m, n = cin()

# 输入一个数组
arr = cin() # 注意cin2会返回map对象

输入输出重定向

使用操作系统的重定向

1
python script.py < input > output

Python 与 STL

Python 标准库 — Python 3.8.12 文档

本人出身于C/C++,这里用类STL表示Python中可利用的built in lib

priority queue (heap)

优先队列往往用堆来实现。优先队列 - 维基百科

1
from heapq import *

vector

1
2
3
arr = list()
arr = [0]*n
arr = [[0]*n for _ in range(m)]

set

1
2
set_ = set()
set_ = {1, 2, 3}

map

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from collections import Counter, defaultdict
arr = [1, 1, 2, 2]
counter = Counter(arr)  # 计数
defaultdict_ = defaultdict(lambda: -1)  # 默认字典

dict_ = dict()
dict_ = {
    1: 2,
    2: 4
}
dict_ = {i: i for i in range(5)}

stack

5. 数据结构 — Python 3.8.12 文档

列表方法使得列表作为堆栈非常容易,最后一个插入,最先取出(“后进先出”)。要添加一个元素到堆栈的顶端,使用 append() 。要从堆栈顶部取出一个元素,使用 pop() ,不用指定索引。

queue

5. 数据结构 — Python 3.8.12 文档

列表也可以用作队列,其中先添加的元素被最先取出 (“先进先出”);然而列表用作这个目的相当低效。因为在列表的末尾添加和弹出元素非常快,但是在列表的开头插入或弹出元素却很慢 (因为所有的其他元素都必须移动一位)。

若要实现一个队列,可使用 collections.deque,它被设计成可以快速地从两端添加或弹出元素

1
from collections import deque

不需要指针的链表

1
2
3
4
class LinkedListNode:
    def __init__(self, val, nxt) -> None:
        self.val = val
        self.nxt = nxt
1
vals, nxt = [], []

还可以是双指针链表

1
vals, pre, nxt = [], [], []
0%