算法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 小时前
Android字节码处理-函数耗时统计揭秘
算法·面试
菠菠萝宝3 小时前
【Java八股文】11-分布式及场景面试篇
java·分布式·面试·k8s·系统·uuid·mq
hxung3 小时前
MySQL面试学习
学习·mysql·面试
Nicole Potter16 小时前
请说明C#中的List是如何扩容的?
开发语言·面试·c#
拉不动的猪19 小时前
刷刷题16
前端·javascript·面试
支撑前端荣耀19 小时前
基于 Vue 的响应式瀑布流实现全景解析
前端·javascript·面试
哑巴语天雨19 小时前
前端面试-网络协议篇
websocket·网络协议·http·面试·https
01_20 小时前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
小天努力学java21 小时前
【面试系列】Java开发--AI常见面试题
java·人工智能·面试
一个 00 后的码农1 天前
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
考研·面试·面试问题·考研复试·考研调剂·面试真题·林业考研