一、输入获取(核心两类场景)

1. 基础 input()

input() 读取一整行,返回字符串,末尾换行自动剔除。

1.1 读取单个数字(数字单独一行)

1
2
3
4
# 输入每行仅一个数字
a = int(input())
f = float(input())
s = input() # 读取字符串,原样保留空格

报错场景:一行输入多个数字 2 3,直接 int(input()) 会报错 invalid literal

1.2 一行多个数字(OJ高频)

1
2
3
4
5
6
7
8
# 一行两个整数,空格分隔
a, b = map(int, input().split())

# 一行任意数量数字,存入列表
nums = list(map(int, input().split()))

# 浮点型多数字
x, y = map(float, input().split())

split() 特性:自动按任意空白(空格、Tab、多个连续空格)分割。

1.3 分行读取多组数据

1
2
3
4
5
6
# 读取n行数字
n = int(input())
arr = []
for _ in range(n):
val = int(input())
arr.append(val)

2. 高速输入 sys.stdin(大数据量推荐)

数据量大时 input() 速度慢,使用 sys 批量读取。

1
2
3
4
5
6
7
8
9
10
11
import sys

# 读取所有输入,按行分割
lines = sys.stdin.readlines()
a = int(lines[0])
b = int(lines[1])

# 一次性读取全部数字(无视换行/空格)
data = list(map(int, sys.stdin.read().split()))
a = data[0]
b = data[1]

3. 输入格式冲突报错说明

代码写法 要求输入格式 错误输入 报错信息
a=int(input()) 一数一行 2 3 ValueError: invalid literal for int()
a,b=map(int,input().split()) 一行两个数 仅输入1个数 ValueError: not enough values to unpack

二、输出 print 用法

2.1 基础打印

1
2
3
4
5
6
7
8
print("Hello")
print(123)
# 多参数自动空格分隔
print(a, b, "result")
# 不自动换行
print("NO", end="")
# 自定义分隔符
print(1,2,3, sep=",") # 1,2,3

2.2 格式化输出

1
2
3
4
5
6
7
8
9
10
# f-string(推荐,Python3.6+)
x = 10
print(f"数字是{x}")

# format 兼容旧版本
print("数字是{}".format(x))

# 保留小数
pi = 3.14159
print(f"{pi:.2f}") # 保留2位小数

2.3 批量输出(大数据)

多次 print 效率低,拼接字符串一次性输出:

1
2
3
4
res = []
res.append("YES")
res.append(str(123))
print('\n'.join(res))

三、Python 容器(对标 C++ STL)

1. list 数组 / vector

对应C++ vector<int>,可变、有序、可重复。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 初始化
arr = []
arr = [1,2,3]
arr = [0]*10 # 长度10,全0

# 增删改查
arr.append(4) # 尾部添加 push_back
arr.pop() # 删除尾部 pop_back
arr.pop(0) # 删除头部(效率低)
arr.insert(1, 99) # 指定位置插入
arr.remove(2) # 删除第一个值为2的元素
print(arr[0]) # 下标访问
print(len(arr)) # size()

2. deque 双端队列(queue / deque STL)

需导入 collections,首尾增删O(1),替代list做队列。

1
2
3
4
5
6
7
8
9
from collections import deque
q = deque()

q.append(1) # 队尾入队 push_back
q.appendleft(2)# 队头入队 push_front
q.popleft() # 队头出队 pop_front
q.pop() # 队尾出队 pop_back
print(q[0]) # 取队首 front()
print(len(q)) # size()

3. set 集合(std::unordered_set / set)

元素唯一、无序,去重、查找O(1)。

1
2
3
4
5
6
s = set()
s.add(1) # insert
s.add(1) # 重复添加自动忽略
s.remove(1) # 删除元素
print(1 in s) # 查询是否存在 count()
print(len(s)) # size()

4. dict 字典(std::unordered_map / map)

键值对存储,key唯一,哈希查找。

1
2
3
4
5
6
7
8
9
10
11
12
mp = {}
mp["a"] = 10 # map[key] = val
mp[5] = 20

print("a" in mp) # 判断key是否存在
print(mp.get("b", 0)) # 不存在返回默认值0
del mp["a"] # 删除键值对
print(len(mp)) # size()

# 遍历键、值
for k in mp:
print(k, mp[k])

5. tuple 元组

不可变数组,对应const vector,不能增删改。

1
2
3
t = (1,2,3)
print(t[0])
# t[0] = 99 报错,无法修改

容器功能对标简表

Python容器 C++ STL 核心特性
list vector 可变有序数组,尾部操作快
deque deque / queue 双端快速增删,适合队列BFS
set unordered_set 自动去重,快速查找
dict unordered_map key-value哈希映射
tuple const vector 只读固定长度数组

四、通用刷题模板(OJ专用,带Main类避免判题报错)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# -*- coding: utf-8 -*-
from collections import deque

class Main:
def main(self):
# 输入1:一行两个数字
a, b = map(int, input().split())
# 输入2:数字分行读取
# a = int(input())
# b = int(input())

# 逻辑处理示例
a %= 2
b %= 2
if a == 1 or b == 1:
print("NO")
else:
print("YES")

if __name__ == "__main__":
Main().main()

五、补充注意事项

  1. 编码声明:代码含中文注释时,首行添加 # -*- coding: utf-8 -*-,消除 Non-ASCII 报错;
  2. 输入格式严格匹配:判题系统输入固定,分行输入不能用 split(),单行多数字不能分次 input()
  3. 容器选择:BFS广度优先搜索优先用 deque,不要用 list 频繁 pop(0)(时间复杂度高);
  4. 大数据优化:数据量上万时,使用 sys.stdin.read() 一次性读取全部输入,减少IO耗时。