算法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 天前
后端面试通关笔记:从真题到思路(五)
面试·职场和发展
前端一小卒1 天前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
xlp666hub1 天前
C进阶之内存对齐,硬件总线和高并发伪共享的底层原理
面试·代码规范
xhxxx1 天前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
yaoh.wang1 天前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
Haooog1 天前
Docker面试题(不定时更新)
java·docker·面试
feathered-feathered1 天前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试
a程序小傲1 天前
小红书Java面试被问:java创建对象有哪些方式?
java·开发语言·面试
想用offer打牌1 天前
一站式了解数据库三大范式(库表设计基础)
数据库·后端·面试
小橙编码日志1 天前
MongoDB深入与实战:基于SQL的对照解析
后端·面试