算法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()以及循环读取和文件对象。

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

相关推荐
Cosolar2 小时前
LlamaIndex 文档解析与分块策略深度解析
人工智能·面试·架构
kyriewen4 小时前
我读了一遍 Babel 编译后的 async/await,终于搞懂了它的原理(附 20 行手写实现)
前端·javascript·面试
zzz_23686 小时前
【RabbitMQ】面试系列 · 第三期:从线上故障到架构选型
面试·架构·rabbitmq
user73263921004786 小时前
借助AI再次理解三次握手和四次挥手
网络协议·面试
zzz_236811 小时前
【Spring】面试突击系列(六):Spring 工程实践与面试综合
java·spring·面试
牛油果子哥q12 小时前
【C++ this指针】C++ this指针深度精讲:this底层本质、存储位置、调用机制、const this指针、空指针调用、面试坑点与工程实战
开发语言·c++·面试
用户479492835691512 小时前
盛大集团面经(专升本毕业 9 个月,99%代码靠 AI 写)
面试
Elias不吃糖12 小时前
AI Resume Forge:基于 LangGraph 的 AI 简历优化与模拟面试平台
java·人工智能·面试·agent开发
程序员二叉12 小时前
【Java】String 全套高频面试题详解
java·开发语言·面试
小江的记录本13 小时前
【Spring全家桶】Spring AI核心原理、大模型集成、Prompt工程、RAG实现、AI Agent开发(附《思维导图》+《面试高频考点清单》)
java·人工智能·spring boot·后端·spring·面试·prompt