python ACM下读取终端输入

发布时间:2026/7/24 1:21:35
python ACM下读取终端输入 在 ACM 模式即在线判题系统下Python 程序需要从标准输入stdin读取数据。常见的方法有input()、sys.stdin.readline()和sys.stdin.read()它们适用于不同的场景。下面详细介绍它们的用法和区别并给出针对多组测试数据的通用处理模板。1. 基础方法(1)input()—— 最简洁适合行数较少# 读取一行字符串不含末尾换行符lineinput()# 读取并转换为整数nint(input())# 读取一行整数空格分隔a,bmap(int,input().split())每次调用读取一行忽略末尾的\n。内部会调用sys.stdin.readline()并自动去除换行符。缺点在数据量很大时速度较慢因为内部有额外处理。注意是程序读到input()时会在终端提示输入Enter后结束输入。(2)sys.stdin.readline()—— 更高效importsys linesys.stdin.readline()# 读取一行保留换行符nint(sys.stdin.readline())# 转为整数a,bmap(int,sys.stdin.readline().split())比input()快适合数据量较大时。注意返回的字符串末尾有\n可以用.strip()去除但.split()会自动处理空白字符所以通常无需额外 strip。(3)sys.stdin.read()—— 一次性读取全部importsys datasys.stdin.read()# 读取所有输入包括换行符tokensdata.split()# 按任意空白字符分割得到所有 token# 然后依次取用例如nint(tokens[0])适合已知全部输入且需要快速处理大量数据的场景。所有 token数字、字符串等都按顺序存放在列表中需要自己维护索引。也可以使用sys.stdin.buffer.read()读取字节流速度更快需自行解码。2. 处理多组测试数据直到 EOF在线判题中常见格式输入包含多组数据每组占若干行但事先不知道组数。此时需要循环读取直到文件末尾。方法一使用sys.stdin.readline()循环importsysforlineinsys.stdin:# 如果输入有空行可以跳过lineline.strip()ifnotline:continue# 处理这一行例如n,mmap(int,line.split())# ... 继续读取后续行如果需要方法二使用sys.stdin.read()按 token 处理importsys tokenssys.stdin.read().split()i0whileilen(tokens):nint(tokens[i]);i1mint(tokens[i]);i1# ... 处理这组数据3. 常见场景示例场景1单组数据第一行是 n第二行是 n 个整数importsys nint(sys.stdin.readline())arrlist(map(int,sys.stdin.readline().split()))# 处理 arr场景2多组数据每组第一行是 n接下来 n 行每行两个整数直到 n0 结束importsysforlineinsys.stdin:nint(line.strip())ifn0:breakfor_inrange(n):a,bmap(int,sys.stdin.readline().split())# 处理 a, b场景3输入只有一行包含若干个整数个数未知importsys arrlist(map(int,sys.stdin.read().split()))# 所有整数都在 arr 中场景4输入包含多组每组第一行为一个字符串第二行为两个整数组数未知importsys linessys.stdin.read().strip().splitlines()# 或者逐行读取ititer(sys.stdin.read().splitlines())forlineinit:sline.strip()ifnots:continuen,mmap(int,next(it).split())# 处理 s, n, m4. 性能建议如果数据量很大例如 10^6 个整数推荐使用sys.stdin.buffer.read().split()将输入全部读入并分割速度最快。importsys datasys.stdin.buffer.read().split()# data 是字节列表可以迭代并 int() 转换ititer(data)nint(next(it))如果按行读取用sys.stdin.buffer.readline()比sys.stdin.readline()更快因为省去了解码过程但需要手动解码如line.decode()或直接处理字节流实际使用中若数据量不是极大sys.stdin.readline()已足够。5. 注意事项换行符input()自动去除末尾换行readline()需要手动.strip()或.rstrip(\n)。空白行如果输入有空行循环中需判断if not line: break或跳过。类型转换读取到的都是字符串需要显式int()或float()转换。混合输入若一行中既有字符串又有数字按空格分割后依次处理。输出ACM 模式通常要求结果输出到标准输出使用print()或sys.stdout.write()记得换行。6 总结方法适用场景速度input()输入行数不多简单场景较慢sys.stdin.readline()多行、大量数据较快sys.stdin.read()一次性读取全部灵活处理快sys.stdin.buffer.read()超大数据追求极致速度最快推荐做法平时比赛用sys.stdin.readline()结合循环若输入格式简单且已知全部数据量用sys.stdin.read().split()效率最高。例如处理多组简单数据时常用的万能模板importsysdefsolve():datasys.stdin.buffer.read().split()ititer(data)whileTrue:try:nint(next(it))exceptStopIteration:break# 读后续数据...# 处理并输出结果if__name____main__:solve()7 根据“多行数据”的具体格式选择对应的代码处理方式场景一已知总行数第一行告诉你有几行例如输入3 1 2 3 4 5 6代码importsys nint(sys.stdin.readline())for_inrange(n):a,bmap(int,sys.stdin.readline().split())# 处理每一行场景二不知道有多少行一直读到文件末尾最常见的 ACM 多组输入例如输入1 2 3 4 5 6代码最简洁、高效importsysforlineinsys.stdin:# 自动逐行读取直到 EOFlineline.strip()ifnotline:# 跳过可能存在的空行continuea,bmap(int,line.split())# 处理当前行或者如果每行数字个数固定也可以用read().split()一股脑全取出来importsys datasys.stdin.read().split()# 得到 [1,2,3,4,5,6]# 按顺序两两一组读取foriinrange(0,len(data),2):aint(data[i])bint(data[i1])场景三多行数据但以特定内容结束如输入0结束例如输入1 2 3 4 0 0代码importsyswhileTrue:a,bmap(int,sys.stdin.readline().split())ifa0andb0:break# 处理 a, b场景四读取多行字符串比如若干行英文句子importsys linessys.stdin.read().splitlines()# 保留每一行不含换行符forsinlines:# 处理每一行字符串