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

前言

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

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

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

Python处理输入的三种方式

1. input()

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

2. sys.stdin.readline()

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

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

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

处理多行输入

1. 循环读取

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

python 复制代码
import sys

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

2. 读取整个文件

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

示例代码:
ini 复制代码
python
import sys

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

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

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

3. 使用文件对象

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

示例代码:
csharp 复制代码
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行,输入用作排名的科目名称。 若科目不存在,则按总分进行排序。

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

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

python 复制代码
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()以及循环读取和文件对象。

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

相关推荐
黄敬峰1 小时前
从零理解 Next.js:SPA 的 SEO 短板与 SSR 全栈方案
面试
进击的蛋蛋2 小时前
JS对象的遍历
javascript·面试
淡海水2 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
杨航 AI5 小时前
** AI 面试算法 50 题清单**,不是单纯的 LeetCode 题号列表,而是按照“**考察概率 × 面试价值 × 你当前准备方向**”排序
算法·leetcode·面试
无我Code12 小时前
开发者-2026年中总结
前端·面试·程序员
kyriewen16 小时前
今年裁了16万技术人——但字节前端岗反而涨了23%
前端·javascript·面试
众人皆醒我独醉18 小时前
训练加速实战:Flash Attention、Gradient Checkpointing 与数据流水线
后端·面试·gpu
Loveyourself18 小时前
Claude Code Memory 总体系核心代码逐行解析
面试·agent
王林不想说话18 小时前
ES6 到 ES2026 全面进阶指南:新特性、原理、示例与工程落地
前端·javascript·面试
黄敬峰18 小时前
TypeScript 必考题:type 和 interface 的区别一次搞懂
面试