算法ACM 笔试:python如何处理多行输入

8 阅读4分钟

前言

在ACM模式的编程竞赛,或面试算法机试(华为等)中,如何处理输入数据是一项基本技能。

如果我们使用 Python 解题,该如何处理数据的输入?

其实 Python 提供了多种方式来读取和处理输入数据,本文将详细介绍Python处理输入数据的几种方式,并重点讲解如何处理多行输入。

Python处理输入的三种方式

1. input()

input()函数用于读取用户输入的一行数据,并将其作为字符串返回。该函数不会读取换行符\n,因此返回的字符串末尾不包含\n

2. sys.stdin.readline()

sys.stdin.readline()函数同样用于读取一行数据,但它会保留行尾的换行符\n。在使用时需要导入sys模块。

这两种方式都适用于单行输入,如果一行中包含多个值,可以使用split()方法进行分割。

如果是不确定行数的多行读取呢?

处理多行输入

1. 循环读取

对于不确定行数的多行输入,可以使用循环结构来不断读取输入,直到遇到特定的结束标志(如文件结束EOF)。

import sys

# 使用 sys.stdin.readline() 读取多行输入
for line in sys.stdin:
    line = line.strip()  # 去除行尾的换行符
    # 处理每行数据
    # 例如:分割数据
    values = line.split()
    # 根据需要进行进一步处理

2. 读取整个文件

如果输入数据量不大,也可以一次性读取整个文件内容,然后按行处理。

示例代码:
python
import sys

# 读取整个文件内容
input_data = sys.stdin.read()

# 按行分割
lines = input_data.splitlines()

# 处理每一行
for line in lines:
    # 处理每行数据
    # 例如:分割数据
    values = line.split()
    # 根据需要进行进一步处理

3. 使用文件对象

如果你的输入数据存储在文件中,可以直接使用文件对象来读取多行数据。

示例代码:
python
# 假设输入文件名为 input.txt
with open('input.txt', 'r') as file:
    for line in file:
        line = line.strip()  # 去除行尾的换行符
        # 处理每行数据
        # 例如:分割数据
        values = line.split()
        # 根据需要进行进一步处理

示例题——2024E-智能成绩表

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
难度:简单

描述

小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名,你能帮帮他吗?

输入描述

第1行输入两个整数,学生人数n和科目数量m。0 < n < 100,0 < m < 10

第2行输入m个科目名称,彼此之间用空格隔开,科目名称只由英文字母构成,单个长度不超过10个字符。

科目的出现顺字和后续输入的学生成绩一一对应。不会出现重复的科目名称。

第3行开始的行,每行包含一个学生的姓名和该生m个科目的成绩空格隔开),学生不会重名。 学生姓名只由英文字母构成,长度不超过10个字符。

成绩是0~100的整数,依次对应第2行中输入的科目。

第n+2行,输入用作排名的科目名称。 若科目不存在,则按总分进行排序。

输出描述

输出一行,按成绩排序后的学生名字,空格隔开。成绩相同的按照学生姓名字典顺序排序。

用例输入 1

3 2
yuwen shuxue
fangfang 95 90
xiaohua 88 95
minmin 100 82
shuxue

用例输出 1

xiaohua fangfang minmin

用例输入 2

3 3
yuwen shuxue yingyu
fangfang 95 90 100
xiaohua 88 95 20
minmin 100 82 60

用例输出 2

fangfang minmin xiaohua

解题思路

这题思路很简单,就是对数据进行排序。重点是如何处理数据输入。

第n+2行,输入用作排名的科目名称。 若科目不存在,则按总分进行排序。

最后一行输入不存在时需要进行处理。

这种情况就可以使用循环输入的方式去处理。

import sys

n, m = map(int, input().split())
sc = input().split()
arr = []
i = 0
sort_by = None
for line in sys.stdin:
    line = line.strip()
    if i < n:
        arr.append(line.split())
    else:
        sort_by = line
    i += 1
    

nums = []
for i in range(n):
    total = 0
    tmp_arr = [arr[i][0]]
    for j in range(1, m + 1):
        tmp = int(arr[i][j])
        total += tmp
        tmp_arr.append(tmp)
    tmp_arr.append(total)
    nums.append(tmp_arr)

if sort_by not in sc:
    nums.sort(key= lambda x: (-x[-1], x[0]))
else:
    idx =  sc.index(sort_by)
    nums.sort(key=lambda x: (-x[idx + 1], x[0]))

print(' '.join([item[0] for item in nums]))

另一种方法,实测使用 try 处理异常也可以,不过不建议使用。

小结

Python读取和处理输入数据,包括input()sys.stdin.readline()以及循环读取和文件对象。

通过这些方法,我们可以灵活地处理单行和多行输入。