jklincn


Python 输入输出练习 (ACM 模式)


有些笔试或面试是 ACM 模式,需要自己处理题目的输入与输出,因此需要掌握 Python 中常见的读取输入的写法。

以牛客上的这个题单为例:输入输出练习

只有输出

1
print("Hello Nowcoder!")

单组_A+B

使用 input() 读取一个整行字符串:"10 20"

使用 split() 将输入的字符串按照空格拆分,得到一个列表:["10", "20"]

使用 map() 对列表里的每个元素应用 int(),把字符串转换为整数,返回可迭代对象(非列表):[10, 20]

使用 a, b 序列解包,把返回对象分别赋值给 aba = 10b = 20

1
2
a, b = map(int, input().split())
print(a + b)

多组_A+B_EOF形式

当读到文件末尾,再调用 input() 时就会抛出 EOFError 异常,这时就会跳出循环。

1
2
3
4
5
6
while True:
    try:
        a, b = map(int, input().split())
        print(a + b)
    except EOFError:
        break

如果输入数据量很大,sys.stdin 的写法效率会更高一些:

1
2
3
4
5
import sys

for line in sys.stdin:
    a, b = map(int, line.split())
    print(a + b)

多组_A+B_T组形式

先读取输入组的数量(t),然后使用 range() 控制循环次数。

1
2
3
4
t = int(input())
for i in range(t):
    a, b = map(int, input().split())
    print(a + b)

多组_A+B_零尾模式

1
2
3
4
5
6
while True:
    a, b = map(int, input().split())
    if a | b:
        print(a + b)
    else:
        break

单组_一维数组

使用 list()map() 转换后的可迭代对象收集到列表中赋给 a

1
2
3
n = int(input())
a = list(map(int, input().split()))
print(sum(a))

多组_一维数组_T组形式

1
2
3
4
5
n = int(input())
for _ in range(n):
    s = int(input())
    a = list(map(int, input().split()))
    print(sum(a))

单组_二维数组

1
2
3
4
5
6
n, m = map(int, input().split())
s = 0
for _ in range(n):
    a = list(map(int, input().split()))
    s += sum(a)
print(s)

这只是题目解法,但对于一个二维数组的读取,以下写法会更清晰,有一个 matrix 变量保存了整个矩阵

1
2
3
4
5
6
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
s = 0
for row in matrix:
    s += sum(row)
print(s)

多组_二维数组_T组形式

1
2
3
4
5
6
7
8
t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    s = 0
    for _ in range(n):
        a = list(map(int, input().split()))
        s += sum(a)
    print(s)

单组_字符串

使用 strip() 来去掉可能存在的换行符。(这里的长度 n 在读取输入时没有作用)

1
2
3
n = int(input())
s = input().strip()
print(s[::-1])

多组_字符串_T组形式

1
2
3
4
5
t = int(input())
for _ in range(t):
    n = int(input())
    s = input().strip()
    print(s[::-1])

单组_二维字符数组

1
2
3
4
5
n, m = map(int, input().split())
matrix = [input().strip() for _ in range(n)]

for row in reversed(matrix):      # 倒置行
    print(row[::-1])              # 每行倒置列

多组_带空格的字符串_T组形式

1
2
3
4
5
6
t = int(input())
for _ in range(t):
    n = int(input())
    s = input().strip()
    s = s.replace(" ", "")  # 去掉空格
    print(s[::-1])

单组_保留小数位数

1
2
n = float(input())
print(f"{n:.3f}")

单组_补充前导零

1
2
n = int(input())
print(f"{n:09d}")

单组_spj判断YES与NO

1
2
n = int(input())
print("YES" if n % 2 == 1 else "NO")

单组_spj判断浮点误差

python 的 math 库提供了精确的 π 的值

1
2
3
4
5
import math

r = int(input())
area = math.pi * r * r
print(area)

单组_spj判断数组之和

1
2
3
4
n, m = map(int, input().split())
arr = [1] * n      # 初始数组全是 1
arr[0] += m - n    # 把差值加到第一个元素
print(" ".join(map(str, arr)))

更快的 input()

当输入数据大时,使用 sys.stdin.readline 可以起到加速的效果,因为它去除了 input() 中的一些额外处理(比如抛出异常等)。因此可以直接将内置的 input() 修改为 sys.stdin.readline,其余写法保持不变。

1
2
import sys
input = sys.stdin.readline

实际测试如下,通常会有3倍左右的加速

文件大小 input() sys.stdin.readline() 加速比
2 MB (100000 行,每行字符串长度 20) 0.040 s 0.012 s 3.22x
20 MB(1000000 行,每行字符串长度 20) 0.289 s 0.073 s 3.94x
200 MB(10000000 行,每行字符串长度 20) 2.400 s 0.762 s 3.15x

测试代码:test.py


本站不记录浏览量,但如果您觉得本内容有帮助,请点个小红心,让我知道您的喜欢。